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()。
我目前正在使用 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()。