DropboxfilesGetTemporaryLink генерирует неуловимое сообщение UnhandledPromiseRejectionWarning и завершает работу Node.js

Чтобы получить ссылку для загрузки на файл, размещенный в 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: #

(узел:9156) UnhandledPromiseRejectionWarning: необработанное отклонение обещания. Эта ошибка возникла либо из-за выброса внутри async без блока catch или отклонив обещание, которое не было обработано с помощью .catch(). Чтобы завершить процесс узла при отклонении необработанного обещания, используйте флаг CLI --unhandled-rejections=strict(см. https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (идентификатор отказа: 2)

(узел:9156) [DEP0018] DeprecationWarning: необработанные отклонения обещаний устарели. В будущем необработанные отклонения обещаний завершат процесс Node.js с ненулевым кодом выхода.

Я проверил несколько вариантов и пришел к выводу, что проблема в:

const operationResult = await dbx.filesGetTemporaryLink({
    path: `/${CONFIG_STORAGE.uploader.assetsPath}/${fileUUID}`
});

Я не могу понять, почему Node.js утверждает "необработанное отклонение обещания" или "обещание, которое не было обработано с помощью .catch()" И бросает UnhandledPromiseRejectionWarning исключение, если код, который его генерирует, обернут try-catch?

При запуске Node.js 15.xx отклонения обещаний, которые не были обработаны, завершат процесс Node.js с ненулевым кодом выхода. Следовательно, как избежать UnhandledPromiseRejectionWarning?

Временное решение:

Чтобы запустить Node.js с флагом --unhandled-rejections=warn.
Это предотвратит завершение процесса Node.js с ненулевым кодом выхода при UnhandledPromiseRejectionWarning.

2 ответа

Решение

Проблема была в библиотеке Dropbox и была решена командой Dropbox с выпуском 7.1.0. После обновления код в вопросе работает правильно.

Попробуйте изменить свой fileResponseфункция примерно так. Вы путаете async/ await с участием .then().catch() синтаксис стиля.

Просто оберните свою функцию в try-catch

         async function getDocument() {
  try {
    const response = await fetch(`${http() + ip}/downloadDocument`, {
      body: JSON.stringify({fileUUID: oModel.oData[0].documentFile}),
      cache: "no-cache",
      credentials: "same-origin",
      headers: {
        "Content-Type": "application/json"
      },
      method: "POST",
      mode: "cors"
    });

    const data = await response.json();
    
    return data;
  } catch(err) {
    console.log(err);
  }
}

Другие вопросы по тегам