gpt4 book ai didi

mysql - Meteor -mysql 方法不返回记录

转载 作者:行者123 更新时间:2023-11-29 05:01:28 25 4
gpt4 key购买 nike

我是 Meteor 的新手,我使用的是 MySQL 数据库而不是 MongoDB。我想从服务器上的一种 Meteor 方法返回 mysql 记录,我试图返回相同的结果,在客户端我想将它们打印到控制台中。但它打印为“未定义”。

enter image description here

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")
}
});

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

最佳答案

这看起来像是回调问题的经典返回值: 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。返回 promise :

    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 functionsasync/await 在您使用的库已经返回 promises 或您可以 promisify 相关函数时效果最佳。我还没有检查 mysql 是否可以返回 promise ,所以我将使用 pify 模块来 promise 示例中的函数

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 函数 中可用。 async 函数总是返回一个 promise。

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

关于mysql - Meteor -mysql 方法不返回记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58197985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com