繁体   English   中英

没有附加res语句发送后无法设置标头

[英]Can't set headers after they are sent without additional res statements

使用sailsjs v0.12.1

index: function(req, res) {
    Customer.find().populate('projects').exec(function(err, customers) {
        customers.forEach(function(customer, index) {
            customer.projects.forEach(function(project, index) {
                // Find project contributors and attach to project
                ProjectContributor.find({
                    project: project.id
                }).populate('user').exec(function(err, contributor) {
                    project.contributor = contributor;

                    return res.json(customers);
                });
            });
        });
    });
}

这将触发Error: Can't set headers after they are sent. 有趣的是,此错误并非总是会触发-大约30分钟前一切正常。

此控制器中的其他任何地方都没有其他return res.x语句。

您需要先安装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);
    });
});

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

用异步库的每个函数(async.each)替换forEach语句。所有迭代结束后,将调用一个回调,然后在该回调中放置res.send() 更多信息

我想你只需要写你的:

return res.json(customers);

在forEach循环末尾的语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM