快速异步 - 发送后无法设置标头,双回调?

时间:2016-01-15 02:36:19

标签: node.js mongodb asynchronous express callback

我有一个令人讨厌的问题是'错误:发送后无法设置标头'。在快递。这段代码最初使用的是Restify而不是Express,自从转换它以来,我一直在以这种或那种形式出现这个问题。

代码向另一个API(已编辑出来)发出2个异步请求,并将结果合并为一个JSON,然后将其存储在MongoDB中。

任何见解都会受到赞赏,因为我已经尝试了所有我能想到的,并且不知道为什么相同的功能在Restify中起作用而不是在适当的变化下运行。

请不要评论毁灭金字塔,我知道这不是理想的,但这不是重点;)

app.post('/rest/test', jsonParser, /*keycloak.protect(),*/ function (req, res, next) {
var requestObj = req.body;

try {
    /* run async requests in parallel */
    async.parallel([
        function asyncReqV3(callback) {
            request.post(reqUrl1, option_v3, function(err, response, body) {
                if(err) {
                    console.log(err);   
                    callback(true);     
                    return;
                } else {
                    callback(false, body);
                }
            });
        },
        /* v4 async request */
        function asyncReqV4(callback) {
            request.post(reqUrl2, option_v4, function(err, response, body) {
                if(err) {
                    console.log(err);
                    callback(true);
                    return;
                } else {
                    callback(false, body);
                }
            });
        },
    ],
    /* Collate results and send */
    function collateResults(err, results) {
        if(err) {
            console.log(err);
            return res.status(500).send("Server Error");
        } else {
            /* Merging results */
            var hash = new Map();
            results[0].body.krResult.forEach(function(obj) {
                hash.set(obj.word, obj);
            });
            var final = results[1].body.data.map(function(obj) {
                return Object.assign(hash.get(obj.word) || {}, obj);
            });

            var final_results = final.slice(0, 250).map(function(obj) {
                return {
                    thing1: obj.something,
                    thing2: obj.somethingElse
                }
            });

            /* Store results in DB */
            db.results.insert({
                request: requestObj,
                response: final_results
            });

            res.status(200).send(final_results);
        }
    });
}
catch(e) {
   console.log(e);
   res.status(500).send({});
} 

return next();
});

1 个答案:

答案 0 :(得分:1)

在路线回调结束时,请删除:

return next();

您在这里不需要它,此行将始终在async.parallel完成之前执行(代码中为collateResults)。您很可能在后续路线中发送响应,然后在您的两个请求完成后再次发送响应。