Catch не обрабатывает отказ от обещания

Итак, моя проблема заключается в следующем. Я возвращаю обещание, которое разрешается, когда нет проблем при сохранении некоторых данных, но если (1.) Каталог, в котором я хочу сохранить файл, не существует или (2.) В этой папке уже существует файл с этим именем; обещание отклоняет конкретную ошибку.

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). Но я не смог справиться с ошибкой.

Отладчик выдает следующее: UnhandledPromiseRejectionWarning: {"error":102} UnhandledPromiseRejectionWarning: отклонение необработанного обещания.


person Nicolas4677    schedule 12.04.2020    source источник
comment
$.post это метод публикации jquery ajax или какой-то внутренний код?   -  person palaѕн    schedule 12.04.2020
comment
Да, это почтовый метод jquery ajax.   -  person Nicolas4677    schedule 12.04.2020


Ответы (1)


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);
});

и добавьте промежуточное ПО для обработки ошибок в свое экспресс-приложение, например:

app.use(function(err,req,res,next) {
  console.log(err.stack);
  res.status(500).send({"Error" : err.stack});
});
person palaѕн    schedule 12.04.2020
comment
пусть jqxhr = $.post('/api/save', levelJSON) .done (функция (ответ) {}) .fail (функция (jqxhr, исключение) {}); Я все еще получаю сообщение об ошибке с этим кодом, есть идеи? - person Nicolas4677; 12.04.2020
comment
Я добавил некоторые модификации. Посмотрите, поможет ли это! - person palaѕн; 12.04.2020
comment
Да, спасибо! Лучше обрабатывать ошибки внутри маршрутизатора, теперь работает. - person Nicolas4677; 12.04.2020