【问题标题】:Piping `request` response to server response in MySQL callback not working as expected? nodejs在 MySQL 回调中对服务器响应的管道“请求”响应未按预期工作?节点
【发布时间】:2013-06-20 13:37:55
【问题描述】:

我很难理解为什么我在下面提供的代码没有像我预期的那样工作。基本概念是:

浏览器 -> 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);

我们非常欢迎您的想法和知识,并提前感谢您。

【问题讨论】:

    标签: mysql node.js http callback request


    【解决方案1】:

    因为对 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);
        }
      });      
    });
    

    Have a look here, this is where i got the response from and worked for me!

    【讨论】:

      猜你喜欢
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 2014-08-26
      • 1970-01-01
      • 2019-01-08
      • 2017-12-21
      相关资源
      最近更新 更多