javascript - Catch 不处理 promise 的拒绝

标签 javascript error-handling catch-block

所以,我的问题如下。我返回一个 promise ,当存储某些数据时没有问题时该 promise 会解决,但如果(1.)我想要保存文件的目录不存在或(2.)该文件夹中已存在一个文件用这个名字;该 promise 拒绝特定错误。

Router.post('/save/:userid?/:name?/:type?/:payload?', ( request, response ) => {

    let promise = new Promise( async ( resolve, reject ) => {

        let params = { ...request.params, ...request.query, ...request.body };
        let path = `./GameContent/Data/${ params.userid }`;
        let fileStream = new FileStream();

        let exists = await fileStream.directoryExists( path );
        if ( exists ) {

            let fileDirectory = `${ path }/${ params.name }.json`;
            exists = await fileStream.directoryExists( fileDirectory );

            if ( !exists ) {

                let bytesWritten = await fileStream.writeFileAt ( fileDirectory, params.payload );
                let result = { name: params.name, bytes: bytesWritten, error: 0 };

                resolve( JSON.stringify( result ) );
            }
            else {

                let result = { error: 102 };
                reject( JSON.stringify( result ) );
            }
        }
        else {

            let result = { error: 101 };
            reject( JSON.stringify( result ) );
        }
    });
    response.send( promise );
});

到目前为止一切顺利,但是问题是以下代码未处理拒绝。

$.post('/api/save', levelJSON)
        .catch ( err =>  {
            //Do something...
        });

我当前收到了预期的错误(错误:102)。但是,我无法处理该错误。

调试器抛出这个: 未处理的PromiseRejectionWarning:{“错误”:102} UnhandledPromiseRejectionWarning:未处理的 promise 拒绝。

最佳答案

jQuery $.post没有用于错误捕获的 .catch() 方法。您可以尝试.fail()方法如下:

$.post('/api/save', levelJSON)
    .done(function (response) {
        // success logic here        
    })
    .fail(function (jqXHR, exception) {
        // Error logic here
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        console.log(msg)
    });

您可以更新路由器代码以捕获错误,例如:

Router.post('/save/:userid?/:name?/:type?/:payload?', (request, response, next) => {

  let promise = new Promise(async (resolve, reject) => {
    // Your current code here...
  });

  promise
    .then(function(result) {
      response.send(result);
    })
    .catch(next);
});

并添加 error handling middleware到您的 Express 应用程序,例如:

app.use(function(err,req,res,next) {
  console.log(err.stack);
  res.status(500).send({"Error" : err.stack});
});

关于javascript - Catch 不处理 promise 的拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61167575/

相关文章:

java - catch block 中的语句未执行

javascript - 通过 fetch promises 处理响应错误/http 状态

javascript - 内容安全策略 “Refused to execute inline event handler” 错误

javascript - 不确定如何从子组件更新父状态

Ruby:尝试测试 STDERR 输出时 RSpec 失败

python - Flask 默认错误处理程序未被调用

spring-boot - 使用 reactiveFeignClient 和 CircuitBreaker 进行错误处理

javascript - expressJS promise 和错误处理

javascript - Bootbox 4.1.0 : how to pass localized strings such as Ok, 取消Bootbox的确认?

javascript - 未捕获的 TypeError : Failed to resolve module specifier "...". 相对引用必须以 "/"、 "./"或 "../"开头。在(索引):1