node.js - setheader 给出错误 : "throw new Error(' Can\'t set headers after they are sent.' );"

标签 node.js express sails.js

检查用户是否已经投票时出现此错误。我建议 setheader 事情负责。

代码

index : function(req, res, next){ 
    if(req.method == "POST"){
        var aa =  Users.findOneByEmail(req.param('email'), function(err, data, next){
            if(err) res.serverError(err);
            console.log(data);
            if(data){
                res.redirect('/users');
                return;
            }
        });

        var data = {
            remoteip:  req.ip,
            challenge: req.body.recaptcha_challenge_field,
            response:  req.body.recaptcha_response_field
        };

        // console.log(data);
        var recaptcha = new Recaptcha(PUBLIC_KEY, PRIVATE_KEY,  data);
        recaptcha.verify(function(success, error_code) {
            if(!success){
                return res.serverError(error_code)              
            } else {
                var username =  req.param('username');
                var vote =  req.param('vote');
                var email = req.param('email');
                var reason =  req.param('reason');
                console.log('I am here 2');
                Users.create({
                    username: req.param('username'),
                    email: email,
                    candidate_id : vote,
                    reason : reason
                }).done(function(err, data){
                    if(err){
                        return res.serverError(JSON.stringify(err));
                    } else {
                        return res.send('You sucessfully voted');
                    }
                });
            }

            res.redirect('/candidates/');
        });          
    } else {
        var recaptcha = new Recaptcha(PUBLIC_KEY, PRIVATE_KEY);
        Candidates.find().done(function(err, data){
            res.view({candidates : data, recaptcha_form: recaptcha.toHTML()});
        });
    }
},

错误:

http.js:691     
    throw new Error('Can\'t set headers after they are sent.');
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (http.js:691:11)
    at ServerResponse.res.setHeader (/usr/local/lib/node_modules/sails/node_modules/express/node_modules/connect/lib/patch.js:59:22)
    at ServerResponse.res.set.res.header (/Users/korotane/Documents/node_projects/the_next_indian_pm/node_modules/sails/node_modules/express/lib/response.js:522:10)
    at ServerResponse.res.location (/Users/korotane/Documents/node_projects/the_next_indian_pm/node_modules/sails/node_modules/express/lib/response.js:656:8)
    at ServerResponse.res.redirect (/Users/korotane/Documents/node_projects/the_next_indian_pm/node_modules/sails/node_modules/express/lib/response.js:698:8)
    at /Users/korotane/Documents/node_projects/the_next_indian_pm/api/controllers/UsersController.js:75:14
    at IncomingMessage.<anonymous> (/Users/korotane/Documents/node_projects/the_next_indian_pm/node_modules/recaptcha/lib/recaptcha.js:160:20)
    at IncomingMessage.EventEmitter.emit (events.js:117:20)
    at _stream_readable.js:920:16
    at process._tickDomainCallback (node.js:459:13)

最佳答案

看一下第 4 行:

if(err) res.serverError(err);

问题是,res.serverError 已经发送了 header ,因此由于您没有中断其执行,因此以下任何调用都可能导致错误:res.serverError, res .send, res.redirect.

在您的特定情况下,这是重定向。回溯中对应的行:

...
at ServerResponse.res.redirect (/Users/korotane/Documents/node_projects/the_next_indian_pm/node_modules/sails/node_modules/express/lib/response.js:698:8)
...

长话短说,快速修复方法是将 return 添加到第四行:

if (err) return res.serverError(err);

也就是说,不能保证其他一切都会无缝运行。

关于node.js - setheader 给出错误 : "throw new Error(' Can\'t set headers after they are sent.' );",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21404436/

相关文章:

javascript - Node : Do I need to end HTTP requests to save memory/CPU?

node.js - 如何在使用express/nodejs/passport重定向时使用 session 或cookie传递数据?

javascript - Socket.io/SailsJS 如何订阅除id 以外的属性为true 的实例房间?

javascript - 禁用默认的 sails.js 路由

node.js - 写一个文件保持制表符和 EOL

javascript - 如何使用 NestJS 为特定模块添加路由前缀?

node.js - 检查 dynamodb 中现有的主键

javascript - Express - 更新对数据库MongoDB不生效

express - Vue + Express(NestJS) 不可能完成的任务,您正在使用 Vue 的仅运行时版本,其中

testing - 无法在集成测试中访问 Sails.js 应用程序实例