получение простой информации из БД в node.js ответ http-сервера

#mysql #node.js

#mysql #node.js

Вопрос:

Я пытаюсь получить простую информацию из БД в node.js ответ http-сервера. В следующем фрагменте я вижу результаты DB в системном журнале, но не в http-ответе.

Можете ли вы дать мне несколько идей о том, почему это происходит?

Спасибо.

 var
    sys = require( 'sys' )
    , http = require( 'http' )
    , dbParams = {
          user : 'test'
        , pass : 'test'
        , db : 'just_test'
    }
;

function dbConnect() {
    var Client = require( 'mysql' ).Client
        , client = new Client()
    ;

    client.user = dbParams.user;
    client.password = dbParams.pass;
    client.connect();
    client.query('USE '   dbParams.db);

    return( client );
}

var dbClient = dbConnect();

http.createServer( function( httpRequest, httpResponse ) {
    httpResponse.writeHead( 200, { 'Content-Type' : 'text/plain' } );
    httpResponse.write( '=== START httpResponse'   "n" );

    dbClient.query( 'SELECT * FROM base_events', function (err, dbRes, fields) {
        if (err) { throw err; }

        httpResponse.write( 'Obtained: '   JSON.stringify( dbRes ) );
sys.log( 'FROM DB: '   JSON.stringify( dbRes ) );
    } );

    httpResponse.write( '=== Test'   "n" );
    httpResponse.end();

    dbClient.end();
} ).listen( 8000 );

sys.puts( 'Server running at http://127.0.0.1:8000' );
  

Ответ №1:

Асинхронный обратный вызов для клиента.запрос вызывается после завершения HttpResponse. Попробуйте переместить последние несколько операторов внутри этого обратного вызова — например:

 http.createServer( function( httpRequest, httpResponse ) {
    httpResponse.writeHead( 200, { 'Content-Type' : 'text/plain' } );
    httpResponse.write( '=== START httpResponse'   "n" );

    dbClient.query( 'SELECT * FROM base_events', function (err, dbRes, fields) {
        if (err) { throw err; }

        httpResponse.write( 'Obtained: '   JSON.stringify( dbRes ) );
    sys.log( 'FROM DB: '   JSON.stringify( dbRes ) );

        httpResponse.write( '=== Test'   "n" );
        httpResponse.end();

        dbClient.end();

    } );

} ).listen( 8000 );
  

Комментарии:

1. спасибо, это отлично сработало, у вас есть какие-либо идеи, как я могу получить информацию из БД из обратного вызова для последующей обработки? или мне просто вставить все в этот обратный вызов перед httpResponse.end() ?

2. @Geo вам нужно поместить все в этот обратный вызов, но вы можете использовать OO или EventEmitter, чтобы сделать код более слабо связанным.

3. @geo Я обычно думаю в терминах конечного автомата, когда я работаю с проблемами асинхронности — где асинхронные обратные вызовы — это то, что перемещает вас между состояниями. Иногда конечный автомат достаточно прост, чтобы вы могли просто использовать вложенные обратные вызовы; в других случаях это становится неработоспособным, и вам нужно использовать какой-то другой шаблон, чтобы сделать код управляемым.

4. спасибо Джеффу за мысли, я новичок в node.js мышление, поэтому немного сложнее так быстро понять все преимущества; EventEmitter — нетривиальная концепция для понимания, но я все больше и больше понимаю ее преимущества