场景是:
我想加载一个网页(使用sendFile加载),然后创建一个setTimeout计时器,并使用sendFile将用户重定向到另一个网页,但是出现标题错误。
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()
此时,它会加载第一个网站,然后在计时器完成后,它只会引发标题错误,对此有任何帮助吗?
答案 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();
});