【问题标题】:res.send with forEach loopres.send 与 forEach 循环
【发布时间】:2020-09-02 08:37:14
【问题描述】:

我想使用forEach 循环,如果条件为真,我想通过res.send() 发送我的数据

const files = readFilesSync(path.resolve(uploadFolder + `_files`));

files.forEach(el => {
       if (el.name.includes(fName)) {
           res.send(el.name + el.ext);
       } else {
           console.log('Nothing')
       }
});

在我得到多个“文件”之前它可以正常工作。如果 2 个文件的条件为真,我得到一个错误

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

【问题讨论】:

  • res.send() 终止您的请求响应。在您发出回复后,您无法发送任何内容。你到底想达到什么目标?
  • 出现这个错误是因为你send的回复。一旦你这样做,服务器将当前请求视为“完成”。如果您想发送文件列表,只需在之前“组装”列表并使用 single res.send(fileNames) 发送完整列表

标签: javascript node.js angular


【解决方案1】:

在处理同一个请求时,您不能多次调用res.send。一种方法是过滤列表,连接相关项目,然后将它们一起发送。例如:

const files = readFilesSync(path.resolve(uploadFolder + `_files`));
const result = 
     files.filter(el => el.name.includes(fName)).map(el => el.name + el.ext).join(',');
if (result.length > 0 ) {
    res.send(result);
} else {
    console.log('Nothing');
}

【讨论】:

    【解决方案2】:

    考虑使用write,而不是使用在后台调用end()send(),如下所示:

    files.forEach(el => {
           if (el.name.includes(fName)) {
               res.write(el.name + el.ext);
           } else {
               console.log('Nothing')
           }
    });
    
    res.end()
    

    【讨论】:

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