这看起来像是回调问题的经典返回值:
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
早在 Promise 和异步函数之前,Meteor 就使用 Fibers 在服务器上提供了同步风格的异步调用。如果你好奇,你可以在这里得到一个纲要:https://benjamn.github.io/goto2015-talk/#/
2。返回一个承诺:
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 会检查您是否从方法返回了一个 Promise,并会在将结果发送给客户端之前自动等待结果
3。使用异步/等待
async functions 和 async/await 在您使用的库已经返回承诺或您可以承诺相关函数时效果最佳。
我没有检查mysql是否可以返回promises,所以我将使用pify模块来promisify示例中的函数
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 函数总是返回一个承诺。
这个与 Meteor 示例最相似,只是它使用纯 JavaScript。
一个显着的区别是,当 Meteor 看到一个异步函数时,它的行为就好像你在函数内部运行了 this.unblock(),因此调用方法的顺序是没有保证的(与 wrapAsync 不同)。