如何通过Id node.js在rest API中发送多个POST请求?

如何通过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

我在下面使用node.js创建的RESTAPI中有以下post方法。目前,这个post方法只适用于一个Id。也就是说,我可以指定一个我想要发送post请求的Id。我想更新此post请求,以便输入ID列表。也就是说,给定一个Id列表,我将遍历Id并发送一个具有相同消息体的post请求(每个Id)。在这种情况下,我将发送多个post请求,每个请求都可能成功或失败。在所有帖子的末尾,我想返回一条消息,如“Ids:\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU。考虑到我的帖子请求的结构,我有什么想法可以有效地做到这一点吗

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作为数组时遇到了一些问题。你对此有什么见解吗?