以下のnode.jsを使用して作成したRESTAPIに次のpostメソッドがあります。現在、このpostメソッドは1つのIDで機能します。つまり、POSTリクエストを送信するIDを1つ指定できます。IDのリストを入力できるように、この投稿リクエストを更新したいと思います。つまり、IDのリストが与えられた場合、IDを繰り返し処理し、IDごとに同じメッセージ本文でPOSTリクエストを送信します。その場合、複数の投稿リクエストを送信することになり、それぞれが成功または失敗する可能性があります。すべての投稿の最後に、「ID:______は成功し、ID:_____は失敗しました」のようなメッセージを返したいと思います。私のポストリクエストの構造を考えると、これを効果的に行う方法について何かアイデアはありますか?
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関数を作成してから、POSTエンドポイントに一連のリクエストを投稿することをお勧めします。
次に、各リクエストをループし、結果をクライアントに送り返します。
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.',
});
}
let requests = req.body;
let results = [];
for(let request of requests) {
results.push(await makeRequest(request.id, JSON.stringify(request.messages)));
}
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.'
});
});
POST本文は次のようになります(メッセージに何を含めるべきか正確にはわかりません!):
[
{ "id": 1, "messages": ["foo", "bar"] },
{ "id": 2, "messages": ["foo", "bar"] }
]
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加