javascript - NodeJs 中的 UnhandledPromiseRejectionWarning : Unhandled promise rejection in _. map

标签 javascript node.js express unhandled-exception

当我运行下面的代码块时,我总是收到错误 - UnhandledPromiseRejectionWarning:未处理的 promise 拒绝。此错误是由于在没有 catch block 的情况下抛出异步函数内部或拒绝未使用 .catch() 处理的 Promise 引起的。要在未处理的 Promise 拒绝时终止 Node 进程,请使用 CLI 标志 --unhandled-rejections=strict (请参阅 https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode )。 (拒绝ID:1)


module.exports = (app, spotifyAPI) => {

    app.get('/api/search', requireLogin, async (req, res) => {

        const URI_BASE = keys.ComputerVisionEndpoint + 'vision/v3.0/analyze';
        const imageUrl = "https://upload.wikimedia.org/wikipedia/commons/3/3c/Shaki_waterfall.jpg"; // will be sent as req body
        var results;

        // making API call to microsoft cognitive services API 
        try {
            results = await axios({
                method: 'post',
                url: URI_BASE,
                headers: {
                    'Content-Type': 'application/json',
                    'Ocp-Apim-Subscription-Key' : keys.ComputerVision
                }, 
                params: {
                    'visualFeatures': 'Tags',
                    'details': '',
                    'language': 'en'
                },
                data: {
                "url": imageUrl,
                }
            });
        } catch (err) {
            return res.status(400).send(err);
        }

        // remove the common ones - indoor, outdoor, ground, wall, person, woman, man, ceiling, floor
        const to_filter = results['data']['tags'];
        _.remove(to_filter, (item) => {
            return (item.name === 'indoor' || item.name === 'outdoor' || item.name === 'ground' || item.name === 'wall'
                || item.name === 'person' || item.name === 'woman' || item.name === 'man' || item.name === 'ceiling'
                || item.name === 'floor'
            );
        });


        // searching for relevant songs and adding them to the playlist
        var id;
        try {
            id = await search_and_add(req, res, spotifyAPI, to_filter, playlist_id);
        } catch (err) {
            if (err['statusCode'] === 401) {
                req.logout();
                return res.redirect('/');
            }
            else {
                return res.status(400).send(err);
            }
        }

    });
}

search_and_add = async (req, res, spotifyAPI, to_filter, playlist_id) => {
    _.map(to_filter, async (tag) => {
        try {
            const song_details = await spotifyAPI.searchTracks(tag.name, { limit: 1 });
            //const song_uri = song_details['body']['tracks']['items'][0]['id'];
            console.log(song_details);
        } catch (err) {
            throw err;
        }
    });
     return;
    // figure out where to re direct user 
};

我很确定这是因为 search_and_add 函数中的 map 语句造成的,但我不知道如何摆脱它并提供相同的功能以使 try-catch block 工作?有人可以帮忙吗?

最佳答案

您没有对 search_and_add 中的 _.map(…) 调用回调创建的 promise 执行任何操作。它们只是被忽略,不会被等待,并且在被拒绝时会导致警告。想必您打算在那里使用 Promise.all

function search_and_add(req, res, spotifyAPI, to_filter, playlist_id) {
    return Promise.all(to_filter.map(async (tag) => {
//         ^^^^^^^^^^^^
        const song_details = await spotifyAPI.searchTracks(tag.name, { limit: 1 });
        //const song_uri = song_details['body']['tracks']['items'][0]['id'];
        console.log(song_details);
    });
}

关于javascript - NodeJs 中的 UnhandledPromiseRejectionWarning : Unhandled promise rejection in _. map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62876513/

相关文章:

javascript - 在 Express JS 中处理重定向,同时避免重定向循环

c# - 在客户端保存文本文件而无需任何时间请求许可

javascript - nestjs 应用程序的生产部署的正确方法是什么

node.js - 数据大小限制。错误: Received message larger than max

node.js - 无法读取函数文件夹中的文件

javascript - 使用名称数组表达 router.param

javascript - 如何在JS中从键/值创建字符串数组?

javascript - JQuery 无法在 IE9 中加载

javascript - 如何在 JavaScript 或 jQuery 中通过类名获取值?

node.js - 在 Sequelize 中预保存钩子(Hook)和实例方法?