发送后无法设置标题,从SendFile重定向

时间:2019-09-02 09:53:54

标签: javascript node.js express

场景是:

我想加载一个网页(使用sendFile加载),然后创建一个setTimeout计时器,并使用sendFile将用户重定向到另一个网页,但是出现标题错误。

  • 我已经尝试过像其他答案中所述的CORS方法(包括对每个具有app.use请求的标头)
  • 我尝试过res.end(),但它不仅会加载第一个网站。

应用使用

Steps i followed on device Android Q having build build 6

重定向第一个网页节目。

app.use((req, res, next) => {
   res.append('Access-Control-Allow-Origin','*');
   res.append('Access-Control-Allow-Methods','GET,POST,PUT');
   res.append('Access-Control-Allow-Headers','Content-Type');
   next();
})

路由以显示第一个网页,然后重定向到第二个网页。

res.redirect(`/pantallas/reloj?tiempo=${Response.rows[0].Tiempo_refresco}&next=${Response.rows[1].Ruta_pantalla}`)
res.end()

此时,它会加载第一个网站,然后在计时器完成后,它只会引发标题错误,对此有任何帮助吗?

1 个答案:

答案 0 :(得分:0)

之所以发生这种情况,是因为您发送了两次响应。因此,错误: 发送标头后无法设置。

您不能从同一路径两次返回响应,而是先通过响应发送文件,然后再在设置的超时时间内再次发送文件。这是不允许的。

为什么会这样?

  

Express中的res对象是Node.js的子类   http.ServerResponse(阅读http.js源代码)。您可以打电话   res.setHeader(name,value)尽可能多地直到调用   res.writeHead(statusCode)。在writeHead之后,将标题放入其中   并且只能调用res.write(data),最后只能调用res.end(data)。

错误“错误:发送标头后无法设置标头”。表示您已经处于“正文”或“完成”状态,但是某些函数试图设置标头或statusCode。当您看到此错误时,请尝试查找在某些正文已被写入之后尝试发送标头的任何内容。例如,查找意外调用两次的回调,或发送正文后发生的任何错误。

编辑:

您可以尝试以下方法:

app.use(function(req, res, next) {
  if (req.query.tiempo) {
      setTimeout(() => {
      res.sendFile(path.join(__dirname + req.query.next));
      }, req.query.tiempo * 1000);
  }
  next();
});

app.get('/pantallas/reloj', function(req, res, next) {
     res.sendFile(path.join(__dirname + '/pantallas/reloj.html'));
     next();
});

更多内容:Express sendfile and redirect url