【问题标题】:Send new request response with Node HTTP server使用 Node HTTP 服务器发送新的请求响应
【发布时间】:2017-11-22 02:35:37
【问题描述】:

Stack Overflow 社区,您好。我正在尝试使用 Node HTTP Module 为我的网站提供一个基本的自动完成搜索应用程序,在请求对象上传递新请求的响应(即使用 Node 作为代理,它将转换和重定向服务器内的请求)。

流程基本上是:

客户端浏览器 - 节点 - ElasticSearch - 节点 - 客户端浏览器

我已经开始了:

  • http.createServer (function (req,res)收听请求

  • req 对象中获取主体,并在带有http.request(options, function (newReqResponse)的新请求中使用它

  • 从该 newReqResponse 对象中获取正文并将其发送回 res 对象上的客户端

问题在于 newReqResponse 的内容总是过时的(在最后输入的字符后面留下痕迹)。即:

  • 如果我输入“te”,newReqResponse 的内容对应于我只输入“t”时的内容。
  • 如果我输入“test”,它对应于如果我输入“tes”。

等等。

我尝试使用 Node.js 流并使用文件系统模块来写入和读取同步和异步文件,但结果是相同的。这是整个代码图片的示例:

var http = require('http');
var fs = require('fs');

http.createServer(function (req, res) {
    var reqBody = '';
    var newReqResponseBody = "";
    req.on('data', function (chunk) {
        reqBody += chunk;
        fs.writeFile('reqbody.json', reqBody, function(err) {
        if (err) {
          throw err;
        }
      });
      var options = {
      hostname: '127.0.0.1',
      port: 9500,
      method: 'GET',
      path: '/_search',
      headers: { host: 'es',
        'content-length': Buffer.byteLength(reqBody),
        'content-type': 'application/json',
        accept: 'application/json' },
    };
    
      var newReq = http.request(options, function (newReqResponse) {


    newReqResponse.setEncoding("UTF-8");

    newReqResponse.on('data', function (ch) {
      newReqResponseBody += ch;
    });
    
    newReqResponse.on("end", function() {
      fs.writeFile("newReqResponseBody.json", newReqResponseBody, function(err) {
        if (err) {
          throw err;
        }
      });
    });
    });

  
newReq.on("error", function(err) {
      console.log(`problem with request: ${err.message}`);
      });
newReq.write(reqBody);
newReq.end();


    });
     
    req.on('end', function() {
    var responseBody = fs.readFileSync('newReqResponseBody.json', 'utf8');
console.log(responseBody);
res.end(responseBody);   
    });
      
}).listen(3000, '127.0.0.1');

是否有解决方法来处理 http 服务器中的请求和响应?如果没有,如果您能给我任何有关如何解决此问题的指示,我将不胜感激。

由于 Node 的计划用途相当基本,我更喜欢坚持使用核心模块,而不是必须从 npm 获取新模块,除非有必要。

提前致谢。

编辑:

我所要做的就是在newReqResponse.on("end") 回调中调用res.end(responseBody),这对我来说完全违反直觉,但是......它确实有效。

【问题讨论】:

    标签: node.js http-proxy


    【解决方案1】:

    很高兴您解决了自己的问题。但是,我看到了改进的空间(不确定您是否是新手),尤其是在传输数据时。您可以使用流来执行此操作。

    你可以看到我没有计算内容长度,你被要求不要并且应该根据 HTTP 规范被忽略(对于这种特定情况),因为流以带有 'Transfer-Encoding': 'chunked' 标头的块的形式传递数据。

    const fs = require('fs');
    const http = require('http');
    
    const options = {
        hostname: '127.0.0.1',
        port: 9500,
        method: 'GET',
        path: '/_search',
        headers: {
            'Content-Type': 'application/json'
        }
    };
    
    http.createServer((req, res) => {
        req.pipe(fs.createWriteStream('reqBody.json'));
    
        let request = http.request(options, (newRes) => {
            newRes.pipe(res);
        });
        fs.createReadStream('reqBody.json').pipe(request);
    
        res.setHeader('Content-Type', 'application/json');
    
    }).listen(3000, '127.0.0.1');
    

    如果您不希望将来保存数据并且只想将 req 流通过管道传输到 request,则可以进一步缩短此 sn-p。

    【讨论】:

    • 感谢您的提醒,路易斯!我确实是 Node.js 的新手,以及它附带的所有花哨的词,例如事件循环、流等。在 stackoverflow 中提出这个问题之前,我已经玩过管道流,但现在我会重新讨论这个主题得到你的建议:)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多