首页 > 解决方案 > Promise 在 Express post 请求中返回未定义的 json

问题描述

我在 selectRecipientData 函数中有一个承诺,它从 api 返回一些用户数据。

export async function selectRecipientData({ email }) {

    engage.selectRecipientData({
        listId: listId,
        email: email,
        returnContactLists: false,

    }, function(err, result) {

        if(err) {
            console.log(err);

        } else {
            let recipient = JSON.stringify(result);

            // this logs successfully
            console.log('Recipient details: ' + recipient );

            return recipient;
        }

    });
}

当我在发布请求中调用此函数时。数据记录在承诺中,但在返回时未定义,如下所示:

server.post('/api/v1/public/selectrecipientdata', async (req, res) => {

    formData = req.body;
    let { email } = formData;

    if (!email) {
        res.json({ error: 'Email is required' });
        return;
    }

    try {

        let recipientData = await selectRecipientData({ email });

        // why is this undefined?
        console.log('This is Undefined: '+ JSON.stringify(recipientData) );

        res.json({recipientData});


    } catch (err) {
        res.json({ error: err.message || err.toString() });
    }
});

有人告诉我为什么吗?谢谢

标签: javascriptnode.jsexpress

解决方案


您已将其编写selectRecipientData为回调样式函数,但您将其称为异步/等待样式。如果engage.selectRecipientData返回一个承诺,你可以这样做:

export async function selectRecipientData({email}) {
    const result=await engage.selectRecipientData({
        listId: listId,
        email: email,
        returnContactLists: false,
    });
    const recipient=JSON.stringify(result);
    console.log('Recipient details: ' + recipient );
    return recipient;
}

否则,要将其转换为 Promise,您可以执行以下操作:

export function selectRecipientData({email}) {
    return new Promise((resolve,reject)=>{
        engage.selectRecipientData({
            listId: listId,
            email: email,
            returnContactLists: false,

        }, function(err, result) {
            if (err) {
                reject(err);
            } 
            else {
                let recipient = JSON.stringify(result);
                console.log('Recipient details: ' + recipient);
                resolve(recipient);
            }

        });
    });
}

推荐阅读