【问题标题】:Meteor -mysql methods are not returning the recordsMeteor -mysql 方法不返回记录
【发布时间】:2019-10-03 09:13:05
【问题描述】:

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

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

如何在客户端获得结果?感谢有人帮助我!

【问题讨论】:

    标签: mysql meteor


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-26
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多