NodeJS多次向浏览器写入响应

时间:2016-12-04 23:38:06

标签: node.js

我有一个简单的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}`);

一个例子,我尝试在行之后向用户写一条消息:             responses.push(主体); 使用response.write(),但是这个方法需要一个response.end()才能在浏览器上执行和显示,如果我这样做,我就不能写入流了!

1 个答案:

答案 0 :(得分:0)

在这里结合您的代码问题。首先,你不应该使用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}`);