我怀疑代码有问题,最有可能在catch部分中,这完全使服务器应用程序崩溃。
目标:基本上检查例如实体不存在时可以处理的错误的类型,对于所有其他错误,请在不使应用程序崩溃的情况下将它们优雅地返回给调用方。 / p>
const Article = require("Article");
function upload(row) {
return new Promise(function(resolve, reject){
Article.requestData(row.schema) // if exists
.then(Article.upload.bind(null, row.article)) //may throw error
.then(resolve) // done if OK
.catch(function(error){
if(error.code == "NotFoundException") { // entity doesn't exists
Article.create(row.schema) // create entity
.then(Article.upload.bind(null, row.article)) // upload
.then(resolve, reject); // reject upload error
} else { // upload errors
// reject(error); // tried reject
throw error; // trying re-throw
}
});
});
}
代码首先尝试获取有关实体的信息,如果找不到,则创建它。
现在,上传部分可能会抛出一个错误,我需要将该错误优雅地发回给调用方。
我得到的错误是UnhandledPromiseRejectionWarning
答案 0 :(得分:0)
相同的代码,但被重写。
function upload(row) {
return Article.requestData(row.schema) // if exists
.then(Article.upload.bind(null, row.article)) //may throw error
.catch(function(error){
if(error.code == "NotFoundException") { // entity doesn't exists
return Article.create(row.schema) // create entity
.then(Article.upload.bind(null, row.article)) // upload
} else {
throw error;
});
}
运行new Promise()
通常被人们称为反模式。有时您无法轻松解决它,但这是一种完全不需要的典型情况。
每次调用.then()
或.catch()
时,都会返回一个新的Promise,这与您要从函数中返回的Promise相同。
这里是异步/等待版本,只是为了好玩:
async function upload(row) {
try {
await Article.requestData(row.schema) // if exists
await Article.upload.bind(row.article);
} catch (error) {
if(error.code == "NotFoundException") { // entity doesn't exists
await Article.create(row.schema) // create entity
await Article.upload(row.article);
} else {
throw error;
}
}
}