Создал мыльный API с библиотекой node-soap, но когда я пытаюсь вызвать ошибку, используя
throw {
Fault: {
Code: {
Value: 'soap:Sender',
Subcode: { value: 'rpc:BadArguments' }
},
Reason: { Text: 'Processing Error' }
}
};
как описано в библиотеке, я получаю
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)
это то, что я сейчас делаю
ssm.decrypt(args.request, password, base_key)
.then(function (res) {
console.info(res)
parseString(res, async function (err, result) {
if (err) {
//the throws causes the error
throw {
Fault: {
error: {
data: {
error
} //Error object from catch
}
}
};
} else {
//some code
}
Спасибо
Выдача ошибки внутри асинхронной функции
parseString(res, async function (err, result)...
отклоняет обещание, возвращенное асинхронной функцией, для которого нет обработчика catch. Если parseString
вызывает свой обратный вызов синхронно, вы можете просто удалить объявление async
, оставив вызов как
parseString(res, function (err, result)...
Однако если parseString является асинхронным, его необходимо промисифицировать, чтобы ошибки можно было обработать в окружающей цепочке обещаний. В качестве непроверенного примера:
function doParseString( res) {
return new Promise( function( resolve, reject) {
parseSting( res, function( err, result) {
err ? reject( err) : resolve( result);
});
});
}
которые можно было бы использовать в соответствии с
ssm.decrypt(args.request, password, base_key)
.then( doParseString)
.then( function (result) {
// some code
})
.catch( console.info); // do something with the error
Спасибо, ребята за вашу помощь, но я понял проблему
если для API мыла использовалась асинхронная функция, реализованная с помощью узел-мыло
общение должно осуществляться через обратные вызовы
я изменил бросок на
callback({
Fault: {
error: {
data: {
error
}
}
}
});
и он отлично работает
я нашел это здесь узел-мыло документ
Никогда не передавайте
async function
в качестве обратного вызова. Получите обещание обратно отparseString
.