node.js + MySQL & JSON-result - проблема обратного вызова и отсутствие ответа для клиента

12

Я хотел бы использовать node.js для запроса базы данных mySQL и возврата результатов в качестве JSON для использования в мобильном приложении. К сожалению, мой запрос просто время от времени, и сервер ничего не делает за хорошие 2 минуты, пока файлы журналов не покажут мои console.log() -статы.

Кроме того, обратный вызов не возвращает ничего в качестве результата. Он просто пуст.

// Check dependencies
var http = require('http');
// Create the http server.
// reference: http://net.tutsplus.com/tutorials/javascript-ajax/node-js-for-beginners/
http.createServer(function(request, response) {
    // Attach listener on end event.
    request.on('close', function() {
        console.log('request');

        // run asynchronous 
        getSQL(function(err, result) {
            console.log('json:', result);
            response.writeHead(200, {
                'Content-Type' : 'x-application/json'
            });
            // Send data as JSON string.
            response.end(result);
        });
    });
}).listen(3000);

// Access MySQL via node-mysql
// https://github.com/felixge/node-mysql
function getSQL(callback) {
    var mysql = require('mysql');
    var connection = mysql.createConnection({
        host : 'localhost',
        user : 'user',
        password : 'pw',
        database : 'db',
        socketPath : '/var/run/mysqld/mysqld.sock', // socket for communication from debian <-> client, seems not to be set correcly by default?
    });

    connection.connect();
    var json = '';
    var query = 'SELECT * FROM test';
    connection.query(query, function(err, results, fields) {
        if (err)
            return callback(err, null);

        console.log('The result is: ', results[0]);

        // wrap result-set as json
        json = JSON.stringify(results);
    });
    connection.end();

    callback(null, json);
};

Выход через 2 минуты:

$ node app.js
request
json:
The result is:  { test: 'avc' }
json2: [{"test":"avc"}]

Основываясь на моем основном понимании всей концепции node.js, мой код должен запросить db (он делает) и вернуть json после его завершения через функцию обратного вызова (по-видимому, нет), которая отправляется обратно как ответ клиенту (не может действительно проверить это, поскольку json empty).

Думаю, я сделал одну (или пару) серьезных ошибок. Помощь и/или полезные ссылки были бы очень оценены. Спасибо!

Решение, благодаря hexacyanide

// Check dependencies
var http = require('http');
// Create the http server.
// reference: http://net.tutsplus.com/tutorials/javascript-ajax/node-js-for-beginners/

/***************
* Correction 1: Using the request.on('close', function()( ... )-listener isn't required anymore
***************/
http.createServer(function(req, res) {
    console.log('Receving request...');
    var callback = function(err, result) {
        res.writeHead(200, {
            'Content-Type' : 'x-application/json'
        });
        console.log('json:', result);
        res.end(result);
    };

    getSQL(callback);

}).listen(3000);

// Access MySQL via node-mysql
// https://github.com/felixge/node-mysql
function getSQL(callback) {
    var mysql = require('mysql');
    var connection = mysql.createConnection({
        host : 'localhost',
        user : 'user',
        password : 'pw',
        database : 'db',
        socketPath : '/var/run/mysqld/mysqld.sock', // socket for communication from debian <-> client, seems not to be set correcly by default?
    });

    connection.connect();
    var json = '';
    var query = 'SELECT * FROM test';
    connection.query(query, function(err, results, fields) {
        if (err)
            return callback(err, null);

        console.log('The query-result is: ', results[0]);

        // wrap result-set as json
        json = JSON.stringify(results);

        /***************
        * Correction 2: Nest the callback correctly!
        ***************/
        connection.end();
        console.log('JSON-result:', json);
        callback(null, json);
    });
};
  • 3
    +1 спасибо, искал именно этот пример
  • 0
    @Thariama согласилась, это то, над чем я работаю.

1 ответ

9
Лучший ответ

Вы следуете старшему руководству, в котором вам предлагается дождаться события запроса close перед отправкой ответа, но вам больше не нужно это делать.

Что происходит, вы не отправляете свой ответ, поэтому ваш клиент отключается. Только до тех пор, пока клиент не отключится, когда срабатывает событие close. Поскольку клиент отключился к моменту отправки вашего ответа, вы ничего не получаете на клиенте и видите его только в терминале.

Чтобы устранить эту проблему, просто прекратите ждать события закрытия и запускайте код сразу после вызова обработчика запроса:

var http = require('http');
http.createServer(function(req, res) {
  getSQL(function(err, result) {
    res.writeHead(200, {
      'Content-Type' : 'x-application/json'
    });
    res.end(result);
  });
}).listen(3000);
  • 3
    Спасибо большое, отлично работает! Наверное, мне понадобились бы десятилетия, чтобы понять это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню