1

以下に提供したコードが期待どおりに機能しない理由を理解しようとしてイライラしています。基本的な概念は次のとおりです。

ブラウザー -> Nodejs サーバー -> MySQL コールバック -> 要求 -> サーバー応答。

次のコードが期待どおりに機能する理由を誰かが説明できますか。

// Load modules
var http        = require('http');
var https       = require('https');
var httpProxy   = require('http-proxy'); 
var url         = require('url');
var qstr        = require('querystring');
var path        = require('path');
var requester   = require('request');

var server = httpProxy.createServer(function(request, response) { 

    proxy = requester({
      url: 'http://www.srcnix.com',
      method: 'GET'
    });      

    request.pipe(proxy);
    proxy.pipe(response);

});

server.listen(8080);

ただし、要求を配置してコールバック内にパイプした瞬間、それが MySQL クエリ コールバック (次のように) であろうと別の要求コールバックであろうと、サーバーへの応答のパイプに失敗します。

// Load modules
var http        = require('http');
var https       = require('https');
var httpProxy   = require('http-proxy'); 
var url         = require('url');
var qstr        = require('querystring');
var path        = require('path');
var requester   = require('request');

var globalConf  = require('./config/global.js');

var mysql       = require('mysql');
var connection  = mysql.createConnection({
  host:     globalConf.db.portal.host,
  user:     globalConf.db.portal.username,
  password: globalConf.db.portal.password,
  database: globalConf.db.portal.database
});

var server = httpProxy.createServer(function(request, response) { 
  connection.query('SELECT 1', function(err, rows) {        
    if(rows.length) 
    {
      proxy = requester({
        url: 'http://www.srcnix.com',
        method: 'GET'
      });      

      // PIPE FAILS TO WORK!                
      request.pipe(proxy);
      proxy.pipe(response);
    }
  });      
});

server.listen(8080);

あなたの考えと知識は大歓迎です。事前に感謝します。

4

1 に答える 1

0

mysql へのクエリは非同期であり、時間の経過中にリクエストはすべてのデータの送信を終了したためです。コールバックが完了するまで、リクエストを一時停止する必要があります。

var server = httpProxy.createServer(function(request, response) {
  request.pause();
  connection.query('SELECT 1', function(err, rows) {        
    if(rows.length) 
    {
      request.resume();
      proxy = requester({
        url: 'http://www.srcnix.com',
        method: 'GET'
      });      

      // PIPE FAILS TO WORK!                
      request.pipe(proxy);
      proxy.pipe(response);
    }
  });      
});

ここを見てください、これは私が応答を得て私のために働いた場所です!

于 2013-06-20T05:37:55.890 に答える