NodeJS正在重试后端API调用,如果它在默认超时(2分钟)内没有得到任何响应。这导致POST / PUT / DELETE API调用的问题,这需要更多的响应时间(> 2分钟)。对于来自用户的一个请求,请求将从Nodej多次后端。
我不想增加默认超时,因为我的回复每次都会有所不同。
如果nodeJs / expressJS中有任何配置,请告诉我,以便我可以完全停止nodeJS重试或仅为POST / PUT / DELETE API自定义配置。
我如何发送请求的示例:
let express = require('express');
let router = express.Router();
let async = require('async');
let expressListRoutes = require('express-list-routes');
async.parallel([
function () {
//url: resource/add/
router.post('/add', function (req, res) {
let uiModel = req.body;
let outputJson = Parser.parse(uiModel, 'CREATE');
let requestPromiseModel = {
uri: `${RESOURCES}/${uiModel.resourcePluginId}`,
method: HttpMethod.POST,
json: true,
body: outputJson,
headers: {
'Accept': MIMETypes.APPLICATION_JSON,
'Authorization': MIMETypes.TOKEN_TYPE + req.token
},
resolveWithFullResponse: true
};
rp(requestPromiseModel).then(function (results) {
res.send(results);
}).catch(function (err) {
log.error(`Error: Create Resource Action: ${err}`);
res.send(err.response);
});
});
}
]);
expressListRoutes({prefix: '/resource'}, "API:", router);
module.exports = router;
感谢您提前帮助:)
答案 0 :(得分:0)
在代码中使用async.parallel
是没用的。您只运行一个函数,因此并行运行一个函数没有多大意义。此函数也不会将async.parallel
提供的回调作为其第一个参数调用,因此async.parallel
认为它永远不会完成。更糟糕的是,你在该函数中所做的就是调用router.post()
,可以直接调用:
router.post(
// ...
);
而不是:
async.parallel([
function () {
router.post(
// ...
);
}
]);
如你所知。
它唯一能做的就是在调用expressListRoutes({prefix: '/resource'}, "API:", router);
之前调用router.post()
。
您还在使用req.body
而未使用body-parser
。
最后,这是一种定义request
和request-promise
超时的方法 - 请参阅文档:
timeout - 整数,包含在中止请求之前等待服务器发送响应头(并启动响应主体)的毫秒数。请注意,如果无法建立基础TCP连接,则操作系统范围的TCP连接超时将取代超时选项(Linux中的默认值可以是20-120秒)。
确保您的操作系统超时时间优先。