为了获得 Dropbox 上托管的文件的下载链接,我使用了 Dropbox JavaScript API ( 7.0.0
):
export const fileDownload = async function fileDownload(fileUUID) {
let isSucceeded;
let message;
let file;
const dbx = _dropboxFactory();
try {
const operationResult = await dbx.filesGetTemporaryLink({
path: `/${CONFIG_STORAGE.uploader.assetsPath}/${fileUUID}`
});
if ("OK" === http.STATUS_CODES[operationResult.status].toUpperCase()) {
file = Object.freeze({
length: operationResult?.result?.metadata?.size,
link: operationResult?.result?.link,
mime: mime.lookup(operationResult?.result?.metadata?.name),
name: operationResult?.result?.metadata?.name
});
isSucceeded = true;
message = SYS_MESSAGES.storageFileDownloadSucceeded.code;
} else {
isSucceeded = false;
message = SYS_MESSAGES.storageFileDownloadFailed.code;
}
} catch (err) {
file = "error";
isSucceeded = false;
message = "FIL_NOT_FOUND";
}
const downloadResult = Object.freeze({
file,
isSucceeded,
message
});
return downloadResult;
};
问题是当path
文件错误时,我得到一个 Node.js 异常:
(节点:9156)UnhandledPromiseRejectionWarning:#<Object>
(节点:9156) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在
async
没有 catch 块的函数内部抛出,或拒绝未处理的承诺.catch()
。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志--unhandled-rejections=strict
(请参阅https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。(拒绝编号:2)(节点:9156)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。
我测试了几个选项并得出结论,问题出在:
const operationResult = await dbx.filesGetTemporaryLink({
path: `/${CONFIG_STORAGE.uploader.assetsPath}/${fileUUID}`
});
我无法理解的是,为什么 Node.js 声称“未处理的承诺拒绝”或“未处理的承诺.catch()
”UnhandledPromiseRejectionWarning
并在生成它的代码被包裹时抛出异常try-catch
?
从 Node.js 15.xx 开始,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。因此,如何避免UnhandledPromiseRejectionWarning
?
临时解决方法:
使用 flag 运行--unhandled-rejections=warn
Node.js。
这将防止 Node.js 进程在UnhandledPromiseRejectionWarning
.