我已经解决了这个问题,所以我的问题更多是一个理论问题,因为我试图了解幕后发生了什么,为什么我需要回调
return Promise.reject()
这是我用于验证路线的代码
async customAuth(req, res, next) {
let token = req.header('x-auth');
try{
const userByToken = await User.findByToken(token)
const userByCreator = await User.findOne({_id: req.body.creator})
if (!userByToken || !userByCreator) {
return Promise.reject()
}
else if(userByToken.tokens[0].token !== userByCreator.tokens[0].token){
console.log('its here')
return Promise.reject().catch((err)=>{
res.status(401).send('why do i need this callback?')
})
}
next()
}catch(err){res.status(401).send("something happened")}
}
正如您所看到的那样,当我正在比较userByToken和userByCreator时,我正试图通过回调调用返回Promise.reject()。 如果我尝试删除回调,它会在控制台中告诉我我有未处理的承诺。因为这段代码
,所以我们只是蠢 if (!userByToken || !userByCreator) {
return Promise.reject()
}
完全正常,并发送try块直接捕获,而不会给出未经许可的承诺错误。
问题
为什么我要回电?就像在理论上一样,为什么如果我删除回调它会告诉我它未经处理的承诺?
P.S 好像问题也可以解决
const rejected = await customAuth(Promise.reject('promise was rejected'));
return rejected
但仍然为什么这段代码会起作用,
if (!userByToken || !userByCreator) {
return Promise.reject()
}
但是当我试图进行比较IF阻止它说未处理?
答案 0 :(得分:2)
我认为问题在于,当您执行return Promise.reject()
时,您希望代码转到catch()
块,但return Promise.reject()
只会从函数返回被拒绝的承诺。它没有进入你的捕获块。相反,您可以像这样使用throw
:
async customAuth(req, res, next) {
let token = req.header('x-auth');
try {
const userByToken = await User.findByToken(token)
const userByCreator = await User.findOne({_id: req.body.creator})
if (!userByToken || !userByCreator) {
throw new Error("missing userByToken or userByCreator");
}
else if(userByToken.tokens[0].token !== userByCreator.tokens[0].token){
console.log('its here')
throw new Error("user token doesn't match creator token");
}
next()
} catch(err) {
console.log(err);
res.status(401).send("something happened");
}
}
您可能感到困惑的是,您的try / catch会捕获您正在使用await
的被拒绝的承诺,或者它会捕获throw
,但它不会捕获{{ 1}}因为你明确地返回了它。
因此,当您执行return Promise.reject()
并因此返回被拒绝的承诺并且调用者没有return Promise.reject()
时,您将获得未处理的拒绝承诺。
答案 1 :(得分:0)
Promise.reject()
无法抓住try / catch
,
它只能被捕获
somePromise.cateh(() => {})
,
如果你想在外部捕获中捕获它,
只是throw new Error()
没问题,
不需要return or promise.reject