在没有附加res语句的情况下发送标头后,无法设置标头

时间:2016-06-07 09:10:07

标签: javascript node.js sails.js

使用sailsjs v0.12.1

Error: Can't set headers after they are sent.

这会触发return res.x。这里有趣的是,这个错误并不总是被触发 - 一切都运行良好~30分钟前。

此控制器中的其他任何位置都没有其他{{1}}语句。

3 个答案:

答案 0 :(得分:1)

您需要先安装async库。

npm install async --save

然后您可以使用以下代码

var async = require('async');
// ...
// ...
Customer.find().populate('projects').exec(function(err, customers) {
    var tArray = [];
    async.each(customers, function(customer, cb) {
        var aCustomer = customer; // might want to deep copy it?
        aCustomer.projects = [];
        async.each(customer.projects, function(project, projectCB) {
            ProjectContributor.find({
                project: project.id
            }).populate('user').exec(function(err, contributor) {
                project.contributor = contributor;
                aCustomer.projects.push(project);
                projectCB();
            });
        }, function projectsDone(err) {
            tArray.push(aCustomer);
            cb();
        });
    }, function done(err) {
        return res.json(tArray);
    });
});

我没有测试过代码,但它应该可以正常工作。

答案 1 :(得分:0)

将forEach语句替换为异步库的每个函数(async.each) 当所有迭代都结束时,会调用一个回调,并且在回调中你需要放置你的res.send() More info here

答案 2 :(得分:0)

我认为你只需写下你的:

return res.json(customers);
在forEach循环结束时的

语句。