Nodejs imap-simple UnhandledPromiseRejectionWarning问题

Nodejs imap-simple UnhandledPromiseRejectionWarning issue

我目前正在使用 nodejs 包 imap-simple 检查电子邮件是否已发送。

我已从 imap-simple 站点复制并粘贴相关代码,以首先删除现有电子邮件。

代码如下;

 
var config = {
    imap: {
        user: 'your@email.address',
        password: 'yourpassword',
        host: 'imap.gmail.com',
        port: 993,
        tls: true,
        authTimeout: 3000
    }
};
imaps.connect(config).then(function (connection) {        
    connection.openBox('INBOX').then(function () {
    
        var searchCriteria = ['ALL'];
        var fetchOptions = { bodies: ['TEXT'], struct: true };
        return connection.search(searchCriteria, fetchOptions);
 
    //Loop over each message
    }).then(function (messages) {
        let taskList = messages.map(function (message) {
            return new Promise((res, rej) => {
                var parts = imaps.getParts(message.attributes.struct); 
                parts.map(function (part) {
                    return connection.getPartData(message, part)
                    .then(function (partData) {
                        
                        //Display e-mail body
                        if (part.disposition == null && part.encoding != "base64"){
                            console.log(partData);
                        }
 
                        //Mark message for deletion
                        connection.addFlags(message.attributes.uid, "\Deleted", (err) => {
                            if (err){
                                console.log('Problem marking message for deletion');
                                rej(err);
                            }
 
                            res(); //Final resolve
                        })
                    });
                });
            });    
        })
 
        return Promise.all(taskList).then(() => {
            connection.imap.closeBox(true, (err) => { //Pass in false to avoid delete-flagged messages being removed
                if (err){
                    console.log(err);
                }
            });
            connection.end();
        });
    });
});

但是,它似乎失败了,失败时会记录以下错误;

(node:8063) UnhandledPromiseRejectionWarning: Error: read ECONNRESET at TCP.onStreamRead (internal/stream_base_commons.js:111:27) (node:8063) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:8063) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

我不太确定为什么会产生这个未处理的错误(因为代码是从 imap-simple 站点粘贴的 - 当然除了用户凭据之外)。

我在别处读到我可能需要在某处添加一个 catch,但我以前从未使用过 promises,所以关于我需要在哪里添加这些 的一些指导=27=]catch imap 简单代码中的命令将不胜感激。

如果与 imap 服务器本身的连接失败,那么您可能需要检查您的配置和身份验证。无论如何要捕获错误,您可以使用以下命令:

imaps.connect(config).then(function (connection) {  
    ....
})
.then(....)
.catch((e) => {}) //handle error here

由于您使用的是 .then(),因此您可以像链接 .then() 一样简单地链接 .catch()。 如果您也有多个 .then() 链接,这会起作用,但是对于您的嵌套异步调用,您可能希望以相同的方式添加另一个 .catch()。