【问题标题】:NodeJS write response to browser multiple timesNodeJS多次向浏览器写入响应
【发布时间】:2016-12-05 08:19:26
【问题描述】:

我有一个简单的 nodeJS 服务器,它从另一台服务器获取数据并将它们存储在 JSON 文件中,我需要编写有关获取和生成的每个文件的状态,但这不起作用,因为我必须执行响应。 end(),这意味着我不能在不结束流的情况下再次写入流

这是我的代码:

      var http = require('http');
  var module = require('fs');
  var APIs = [ '/servlet/en', '/servlet/fr' ];
  var langs =[ 'en', 'fr' ];
  var finish = false;
  var host = 'http://www.localtest';
  const port = process.argv[2] || 9000;
  var responses = [];

  http.createServer(function (req, response) {

    for (x in APIs){
      console.log(x);
    var options = {
      host: 'localtest',
      port: 8888,
      path: APIs[x],
      lang: langs[x]
    };

    http.get(options, function(res) {
        res.setEncoding('utf8');
        var body='';
        res.on('data', function(chunk){
          body += chunk;
        });
        res.on('end', function(chunk){
          responses.push(body);

          if (responses.length == 2){
          var d = JSON.parse(responses[1]);
          var d2 = JSON.parse(responses[0]);

        module.writeFileSync("options.lang1"+".json",JSON.stringify(d) , 'utf-8');
        module.writeFileSync("options.lang2"+".json",JSON.stringify(d2) , 'utf-8');
        }
        });

    });

  }

  }).listen(parseInt(port));

  console.log(`Server listening on port ${port}`);

一个例子,我试图在该行之后给用户写一条消息: 响应.push(body); 使用 response.write(),但此方法需要 response.end() 才能在浏览器上执行和显示,如果我这样做,我将无法再写入流!

【问题讨论】:

  • 它没有回答我的问题!!!!
  • 也许我误解了这个问题。想澄清一下吗?为什么你认为做“response.end()”会成为一个问题?
  • 我不知道,我是nodeJS的新手,但是当我第一次写入流时,我不能再这样做了!
  • 考虑在代码中展示您尝试实际解决问题的方法。

标签: node.js


【解决方案1】:

您的代码存在几个问题。首先,你不应该使用module 作为变量,因为这是一个已经在节点的模块系统中使用的词,例如在module.exports

第二,你真的想要有一些控制流。这是一个使用 async 库的完整示例,尽管其他人更喜欢 Promises。

 var http = require('http');
  var fs = require('fs');
  var APIs = [ '/servlet/en', '/servlet/fr' ];
  var langs =[ 'en', 'fr' ];
  var host = 'http://www.localtest';
  const port = process.argv[2] || 9000;

  const async = require('async');
  let responses = [];

  function fetchAndWriteFile(lang, callback){
    var options = {
      host: 'localtest',
      port: 8888,
      path: '/servlet/'+lang,
      lang: lang
    };

    http.get(options, function(res) {
        res.setEncoding('utf8');
        const filename = 'options.'+lang+'.json';
        const fileStream = fs.createWriteStream(filename, {defaultEncoding: 'utf-8'});
        fileStream.on('end', (e)=> {
            if(e) return callback(e);
            return callback(null, filename);
        });

        res.pipe(fileStream)
    });
  }

  http.createServer(function (req, response) {
    // this will run the fetchAndWriteFile once for each lang in langs
    async.map(langs, fetchAndWriteFile, (e, files) => {
        response.end(files); // files will be an array of filenames saved
    });

  }).listen(parseInt(port));

  console.log(`Server listening on port ${port}`);

【讨论】:

  • 谢谢,它在我的代码中起作用,当我运行脚本时,浏览器将始终显示加载图标(尽管文件已生成并保存),我的主要问题是向浏览器
  • 是的,我已经展示了如何做到这一点(保存后将响应写入浏览器)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
相关资源
最近更新 更多