Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js router.post()和“发送后无法设置标头”。导致2x res.render的原因-如何避免这种情况?_Node.js_Express - Fatal编程技术网

Node.js router.post()和“发送后无法设置标头”。导致2x res.render的原因-如何避免这种情况?

Node.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

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', 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');
    }
})