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 でのほとんどのディスク読み取り/DB アクセスは非同期で行われます。これにより、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

助けてくれてありがとう。上記のhttpエラーの原因を見つけました。この callback(row[0].id) のようなコールバック関数を使用するとエラーが表示されますが、この callback('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 に答える
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);
    });
}
于 2013-10-01T15:27:36.553 に答える