Node.js router.post()和“发送后无法设置标头”。导致2x res.render的原因-如何避免这种情况?
test.ejsNode.js router.post()和“发送后无法设置标头”。导致2x res.render的原因-如何避免这种情况?,node.js,express,Node.js,Express,test.ejs <form action="/test2" method="post"><input type="text" /><input type="submit" /></form> test.js var express = require('express'); var app = express(); var router = express.Router(); router.post('/test2', functio
<form action="/test2" method="post"><input type="text" /><input type="submit" /></form>
test.js
var express = require('express');
var app = express();
var router = express.Router();
router.post('/test2', function(req, res) {
res.render('test2'); // cause we need to render the page we send socket.io data to
var socket_data = 'sd';
req.io.in(room).emit('socket',{
socket : socket_data
}); // socket data is send
var body = req.body.form_input; // our input value
var someMoreCodeForExample = request('https:/www.google.com', function(err, resp, google){
if (resp){
res.render('test'); // can't render twice cause of first render is in the game... <-
}
}
if (body == 'wrong'){
var input_error = 'error';
res.render('test', {errors : input_error}); // if input is wrong we redirect user to form page so he can use it again - can't render twice cause of first render is in the game... <-
}
}
所以,如果用户插入错误的输入,他将被重定向回“测试”以提交正确的输入数据。但是……”发送后无法设置标题。在这种特殊情况下,我如何避免这种情况?这是2x res.render的原因,但如何将用户重定向回表单???您需要更改路由,以首先测试req.body,然后根据其值进行渲染:
错误的原因是您首先呈现test2,即发送响应,然后测试req.body值。Javascript中的相等性测试是使用==或==,而不是=.Correct-mistypo.Correct,但我确实简化了这个示例,我已经编辑了我的问题,请随意再看一遍。@innertest您可能应该重新思考这个特定的路由逻辑,因为在发送响应后您根本无法做任何事情。也就是说,在res对象上调用render、redirect、end或任何类似的函数都意味着不能再进一步使用它了。您可能可以在前端AJAX回调中尝试重定向?使用window.href.location,但同样,我建议重新评估情况,并考虑这是否是在这种情况下工作的最佳方式。TL;DR您无法在发送其他存储库的响应后发送响应,我可以使用套接字发送数据,但无论如何都无法更改重定向和url。我仍然需要在开始时设置套接字连接以进行计时。。。所以数据是尽快发送的。嗯,但我想我别无选择,然后用碎片整理应用程序是一个地狱的工作…顺便说一句,你知道一种方法,不重新连接套接字每次url被更改-但保持连接除了不同的网页url吗?@innertest也许问题会有所帮助。
router.post('/test2', function(req, res) {
var body = req.body.form_input; // our input value
if (body === 'wrong') {
var input_error = 'error';
res.render('test', {errors : input_error});
} else {
res.render('test2');
}
})