如何从var require导入函数值?

时间:2013-10-01 15:15:33

标签: mysql node.js

我有这个代码: server.js:

var sql             = require('./libs/mysql');
    app.get('/status', function(req, res) {  
       res.send(sql.readName('1600'));
    });

mysql.js:

exports.readName = function(name){

    var connection = mysql.createConnection(option);
    connection.connect();
    connection.query('SELECT id FROM asterisk.users WHERE name= '+name, function (err, rows, fields) {


    console.log('mysql: ' +rows[0].id);
    return(rows[0].id);

  });

现在,当我发送GET http://mydomain.com/status时,我无法收到回应。但在控制台日志中我看到了正确答案。我的错误在哪里?

3 个答案:

答案 0 :(得分:0)

node.js中的大多数磁盘读取/数据库访问都是异步完成的。这允许node.js与它声称的一样快。您需要使用回调函数来处理这些读取操作的结果。如果您熟悉ajax,则概念类似。

您将从异步运行的connection.query返回。这无处可归。 readName实际上什么也没有返回。您需要做的是实际传递返回值的回调:

app.get("/status", function (req, res) {
    sql.readName("1600", function (err, rows, fields) {
        /* handle err */

        res.send(rows[0].id);
    });
});

当然必须调用此回调:

exports.readName = function (name, cb) {
    /* snip */
    connection.query(query + name, cb);
});

答案 1 :(得分:0)

您无法获得结果,因为return语句位于函数function (err, rows, fields)中。你可以像这样使用回调

var sql = require('./libs/mysql');
app.get('/status', function(req, res) {  
   sql.readName('1600', function(result){
       res.send(result);
   });
});

exports.readName = function(name, callback){

var connection = mysql.createConnection(option);
connection.connect();
connection.query('SELECT id FROM asterisk.users WHERE name= '+name, 
    function (err, rows, fields) {
        console.log('mysql: ' +rows[0].id);
        callback(rows[0].id);
    });
}

答案 2 :(得分:0)

感谢您的帮助。我发现上面描述的http错误原因。如果我使用像这个回调(row [0] .id)这样的回调函数会出现错误,但是如果我们使用像这个回调('id:'+ row [0] .id)这样的语法,那么一切都可以。因此,当我们发送res.send(响应)时,我们无法发送未命名的数据,需要在那里添加一些描述。 所以,我的最终代码如下所示:
server.js

var sql = require(./mysql);
app.get('/status', function(req, res) {  
   sql.readName('1600', function(result){
       res.send(result);
   });
});   

<强> mysql.js

var mysql=require(mysql);
exports.readName = function(name, callback){

    var connection = mysql.createConnection(option);
    connection.connect();

    connection.query('SELECT id FROM asterisk.users WHERE name= '+name,
    function (err, rows, fields) {
            if(err) callback(err);
            else{
           console.log(rows[0].id);
            callback('ID: '+rows[0].id);
            }
        });
       return true;
};