node.js - Express Async - 发送后无法设置 header ,双重回调?

标签 node.js mongodb asynchronous express callback

我遇到了一个恼人的问题:“错误:发送后无法设置 header 。”在 express 中。这段代码最初使用 Restify 而不是 Express 工作,自从转换它以来我一直以一种或另一种形式遇到这个问题。

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

任何见解都将不胜感激,因为我已经尝试了所有我能想到的方法,但不知道为什么相同的功能在适当的更改后可以在 Restify 中工作,而不是在 Express 中工作。

请不要评论末日金字塔,我知道它并不理想,但这不是这里的重点;)

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();
});

最佳答案

在路由回调结束时,删除:

return next();

这里不需要它,并且该行始终会在 async.parallel 完成之前执行(代码中的 collat​​eResults)。您很可能会在后续路由中发送响应,然后在完成两个请求后再次发送响应。

关于node.js - Express Async - 发送后无法设置 header ,双重回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34803488/

相关文章:

ios - swift 数组 : how to append element references in order to update element later on from a synch request?

node.js - 无法找到 electron-prebuilt 的版本号。 - 尝试使用 Electron 重建时

javascript - Node.js 的 Cluster 模块和 Learnboost 的 Cluster 模块有什么区别?

mongodb - 使用 $inc 来增加 Mongoose 的文档属性

node.js - mongodb近似字符串匹配

javascript - 在 angularJS 中如何处理 $http.post 的异步返回?

c# - 如何在 Rx.Net 中使用异步累加器实现 ScanAsync 运算符?

Node.js 与 requestify POST 超时

node.js - 当我启动 .js 服务器文件时出现错误 : connect ECONNREFUSED into node. js

java - 如何使用 Spring Data 将任意数据的子文档持久化到 MongoDB?