0

我有这个代码: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时,我无法收到回复。但是在控制台日志中我看到了正确的答案。我的错误在哪里?

4

3 回答 3

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);
});
于 2013-10-01T15:24:57.957 回答
0

您无法获得结果,因为 return 语句在 function 中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);
    });
}
于 2013-10-01T15:27:36.553 回答
0

感谢您的帮助。我发现上面描述的http错误原因。如果我使用像这样的回调函数(row[0].id)会出现错误,但是如果我们使用像这样的回调('id:'+row[0].id)这样的语法,一切都可以。所以当我们发送 res.send(response) 时我们不能发送未命名的数据,需要放一些描述。所以,我的最终代码如下所示:
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;
};
于 2013-10-02T12:35:24.567 回答