如何通过Id node.js在rest API中发送多个POST请求?
我在下面使用node.js创建的RESTAPI中有以下post方法。目前,这个post方法只适用于一个Id。也就是说,我可以指定一个我想要发送post请求的Id。我想更新此post请求,以便输入ID列表。也就是说,给定一个Id列表,我将遍历Id并发送一个具有相同消息体的post请求(每个Id)。在这种情况下,我将发送多个post请求,每个请求都可能成功或失败。在所有帖子的末尾,我想返回一条消息,如“Ids:\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU。考虑到我的帖子请求的结构,我有什么想法可以有效地做到这一点吗如何通过Id node.js在rest API中发送多个POST请求?,node.js,api,rest,post,Node.js,Api,Rest,Post,我在下面使用node.js创建的RESTAPI中有以下post方法。目前,这个post方法只适用于一个Id。也就是说,我可以指定一个我想要发送post请求的Id。我想更新此post请求,以便输入ID列表。也就是说,给定一个Id列表,我将遍历Id并发送一个具有相同消息体的post请求(每个Id)。在这种情况下,我将发送多个post请求,每个请求都可能成功或失败。在所有帖子的末尾,我想返回一条消息,如“Ids:\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
router.post('/', async (req, res, next) => {
if (isNil(req['api_key'])) {
next();
} else {
try{
if (isNil(req.body) || isEmpty(req.body)) {
logInfo({message: 'Request body is empty or null.', data: req.body}, 'API');
return res.status(400).send({
message: 'Request body is empty or null.',
});
}
let payload = {
topic: process.env.KAFKA_TOPIC,
messages: [],
key: null,
timestamp:
};
payload.key = isNil(req.body.Id) ? '': req.body.Id;
payload.messages = JSON.stringify(req.body);
let result = await kafkaService.publish(new Array(payload));
logInfo({message: 'Settings API Result.', data: result, source: scriptName}, 'API')
} catch(err){
let err_more = { message: 'Error Caught in POST', data: req.body, source: scriptName};
logError(err, err_more, 'API');
newRelic.noticeError(err, err_more);
return res.status(500).send({
message: 'Server Error. Can\'t process your request.',
payload: req.body
});
}
return res.send({
message: 'Settings sent for processing.',
payload: req.body
});
}
}, async (req, res, next) => {
logInfo({message: 'Unauthorized access to settings API', data: req.body}, 'API');
return res.status(401).send({
message: 'Unauthorized access to settings API.'
});
});
我建议创建一个makeRequest函数,然后发布一个id数组和一条消息,如下所示 我们将循环每个id并发布每条消息:
async function makeRequest(id, messages) {
try {
let payload = {
topic: process.env.KAFKA_TOPIC,
messages: [],
key: null,
timestamp: new Date().toISOString()
};
payload.key = isNil(id) ? '': id;
payload.messages = messages;
let result = await kafkaService.publish(new Array(payload));
logInfo({ id, message: 'Settings API Result.', data: result, source: scriptName}, 'API')
return { id, success: true, result };
} catch(err) {
logError({id, message: 'Settings API Result.', data: err }, 'API')
return { id, success: false, result: null, err };
};
}
router.post('/', async (req, res, next) => {
req['api_key'] = "Dd";
if (isNil(req['api_key'])) {
next();
} else {
try{
if (isNil(req.body) || isEmpty(req.body)) {
logInfo({message: 'Request body is empty or null.', data: req.body}, 'API');
return res.status(400).send({
message: 'Request body is empty or null.',
});
}
if (!Array.isArray(req.body.id)) {
logInfo({message: 'ID list required.', data: req.body}, 'API');
return res.status(400).send({
message: 'ID list required.',
});
}
if (!(req.body.message)) {
logInfo({message: 'Message required.', data: req.body}, 'API');
return res.status(400).send({
message: 'Message required.',
});
}
let results = [];
for(let id of req.body.id) {
results.push(await makeRequest(id, JSON.stringify(req.body.message)));
}
const msg = `Ids: ${results.filter(r => r.success).map(r => r.id).join(",")} succeeded and Ids: ${results.filter(r => !r.success).map(r => r.id).join(",")} failed`;
logInfo(msg, 'API');
return res.send({
message: 'Settings sent for processing: ' + msg,
payload: req.body
});
} catch(err){
let err_more = { message: 'Error Caught in POST', data: req.body, source: scriptName};
logError(err, err_more, 'API');
newRelic.noticeError(err, err_more);
return res.status(500).send({
message: 'Server Error. Can\'t process your request.',
payload: req.body
});
}
}
}, async (req, res, next) => {
logInfo({message: 'Unauthorized access to settings API', data: req.body}, 'API');
return res.status(401).send({
message: 'Unauthorized access to settings API.'
});
});
邮政机构看起来是这样的:
{
"id": [ 1, 2, 3],
"message": "testMessage"
}
非常感谢Terry Lennox!!这很有道理。我真的很感谢你抽出时间回答我的问题!没问题!很高兴能提供帮助,每当我回答问题时,我都会学到一些新东西!假设我的帖子正文看起来像:{“id”:[1,2,3],“message”:“testMessage”}。我是否能够遍历
req.body.id
?目前,如果我尝试以这种方式迭代ID,我会得到一个错误。你知道我怎么做这样的迭代吗?非常感谢!我已经在代码中添加了检查ID是否是数组的代码。如果它们是一个数组,我会根据需要发布,如果不是,我会发送状态400并说它一定是一个数组。我已经为此添加了一个http单元测试,但是在接受ID作为数组时遇到了一些问题。你对此有什么见解吗?