Meteor -mysql 方法没有返回记录

Meteor -mysql methods are not returning the records

我是 Meteor 的新手,我正在使用 MySQL 数据库而不是 MongoDB。我想 return mysql 从服务器上的一种 Meteor 方法记录,我尝试 return 相同,在客户端我想将它们打印到控制台。但它打印为 'undefined'。

server.js
----------

    import { Meteor } from 'meteor/meteor';
    import mysql from 'mysql';
    import { Mongo } from 'meteor/mongo';
     Meteor.methods({
        insertJobCurrent:function(EMPLID,callback) {

            var pool = mysql.createConnection({
                host: '127.0.0.1',
                user: 'root',
                password: 'abc1234',
                database: 'dbEmployees'
                //port: '31597'
            });        

            var JobCurrent=[];
            pool.query("SELECT A.EMPLID, B.NAME, A.JOBCODE, A.DEPTID, A.JOB_ENTRY_DT, A.SUPERVISOR_ID FROM Employee A JOIN names B ON A.EMPLID=B.EMPLID WHERE A.ACTIVE='Y' AND A.EMPL_RCD=0 AND A.EMPLID='"+EMPLID +"'", function (error, results, fields){

                console.log(results); // Printing the results in Meteor console
                return results;


            });

            //return jobCurrent.find().fetch();
        }
    });



client.js
--------
    Meteor.call('insertJobCurrent',employeeID, function(err, response){
            if (err) {
                console.log("error: "+ err);
                console.log(response);
            } else{

                console.log(response); // Printing undefined
                console.log("success")
            }
        }); 

如何在客户端获取结果?如果有人帮助我,我将不胜感激!

这看起来像是来自回调问题的经典 return 值: How do I return the response from an asynchronous call?

我不确定您对回调和异步代码的熟悉程度,但目前您函数的一般流程是:

** Method comes in
Create db connection
>> Send async query to mysql
** function ends and returns empty message to client -> client sees empty response
<< async function finishes and runs callback, result goes nowhere because response was already sent to client.

您要做的是等待回调先完成。

您可以通过三种方式使用 Meteor 执行此操作

1。使用 Meteor.wrapAsync

    insertJobCurrent: function(EMPLID,callback) {

        var pool = mysql.createConnection({
            host: '127.0.0.1',
            user: 'root',
            password: 'abc1234',
            database: 'dbEmployees'
            //port: '31597'
        });
        // Wrap the function you want to call
        // The second parameter sets `this` in the wrapped function.
        // I have no idea if the mysql module you're using needs this, but I'm including it just in case
        const wrappedmysqlQuery = Meteor.wrapAsync(pool.query, pool);

        // Now you can call the wrapped function as though it was synchronous
        const results = wrappedmysqlQuery("SELECT A.EMPLID, B.NAME, A.JOBCODE, A.DEPTID, A.JOB_ENTRY_DT, A.SUPERVISOR_ID FROM Employee A JOIN names B ON A.EMPLID=B.EMPLID WHERE A.ACTIVE='Y' AND A.EMPL_RCD=0 AND A.EMPLID='"+EMPLID +"'")
        console.log(results); // Printing the results in Meteor console
        return results;
    }

Meteor.wrapAsync 上的文档如下: https://docs.meteor.com/api/core.html#Meteor-wrapAsync

早在 Promises 和异步函数之前,Meteor 使用 Fibers 在服务器上提供了同步样式的异步调用。如果你很好奇,你可以在这里得到一个纲要:https://benjamn.github.io/goto2015-talk/#/

2。 Return 一个承诺:

    insertJobCurrent: function(EMPLID,callback) {

        var pool = mysql.createConnection({
            host: '127.0.0.1',
            user: 'root',
            password: 'abc1234',
            database: 'dbEmployees'
            //port: '31597'
        });

        return new Promise(function (resolve, reject) { 
            pool.query("SELECT A.EMPLID, B.NAME, A.JOBCODE, A.DEPTID, A.JOB_ENTRY_DT, A.SUPERVISOR_ID FROM Employee A JOIN names B ON A.EMPLID=B.EMPLID WHERE A.ACTIVE='Y' AND A.EMPL_RCD=0 AND A.EMPLID='"+EMPLID +"'", function (error, results, fields) {

                console.log(results); // Printing the results in Meteor console
                resolve(results);
            });
        }))

}

这是有效的,因为 Meteor 会检查您是否return从一个方法中获得承诺,并且会在将结果发送给客户端之前自动等待结果

3。使用 Async/Await

async functionsasync/await 在您使用的库已经 return 承诺或者您可以承诺相关功能时效果最佳。 我没有检查 mysql 是否可以 return 承诺,所以我将使用 pify 模块来承诺示例中的函数

import pify from 'pify'

    insertJobCurrent: async function(EMPLID,callback) {

        var pool = mysql.createConnection({
            host: '127.0.0.1',
            user: 'root',
            password: 'abc1234',
            database: 'dbEmployees'
            //port: '31597'
        });
        // promisify the function you want to call
        const wrappedmysqlQuery = pify(pool.query);

        // Now when we run the promisified function it returns a promise that we
        // can wait for the value of with `await`
        const results = await wrappedmysqlQuery("SELECT A.EMPLID, B.NAME, A.JOBCODE, A.DEPTID, A.JOB_ENTRY_DT, A.SUPERVISOR_ID FROM Employee A JOIN names B ON A.EMPLID=B.EMPLID WHERE A.ACTIVE='Y' AND A.EMPL_RCD=0 AND A.EMPLID='"+EMPLID +"'");

        console.log(results); // Printing the results in Meteor console
        return results;
    }

请注意 await 仅在 async function 内可用。 async 始终履行 return 诺言。

这个与 Meteor 示例最相似,只是它使用纯 javascript。 一个显着的区别是,当 Meteor 看到一个异步函数时,它的行为就好像你在函数内部 运行 this.unblock() 一样,因此不保证调用方法的顺序(与 wrapAsync 不同).