我正在努力找出此异步函数中的错误。我不断收到此错误消息: “意外的令牌捕获”
,如果该错误已修复,我将收到此错误消息: “未处理的承诺拒绝警告” “弃用警告”
router.get('/Views', async (req, res) => {
console.log("Google auth ", googleAuth)
const organizationId = req.verifiedToken.OrganizationId;
console.log("Got here")
const url = myUrl;
try{
const client = await auth.getClient({
scopes: [
'https://www.googleapis.com/auth/analytics.readonly'
]
})catch(err){
console.log(err);
throw err;
};
const outcome = await client.request({ url })catch(err){
console.log(err);
throw err;
};
};
console.log("Successfully connected!", organizationId);
return responses.success(res, outcome.data);
});
答案 0 :(得分:1)
行
const outcome = await client.request({ url })catch(err){
引入了一个catch
异常处理程序,而没有前面的try
块。您似乎已经抓住了(没有双关语)这个语法错误(尽管您没有详细说明更改代码的方法来消除它)。
不幸的是,您尚未发布独立的代码片段,也未指定要在node.js之上使用的框架/库。如果您使用Express框架和ajax库,则可能是您的try
块缺少异常处理程序,并且catch
语句旨在作为方法调用:
router.get('/Views', async (req, res) => {
console.log("Google auth ", googleAuth)
const organizationId = req.verifiedToken.OrganizationId;
console.log("Got here")
const url = myUrl;
try{
const client = await auth.getClient({
scopes: [
'https://www.googleapis.com/auth/analytics.readonly'
]
})
.catch(err){ //*** syntax error in your code sample
console.log(err);
throw err;
};
const outcome = await client.request({
url
})
.catch(err){ //*** syntax error in your code sample
console.log(err);
throw err;
};
} catch (e) { //*** exception handler missing from your original code missing
// exception handling code, possibly empty; there are the .catch calls after all
}
console.log("Successfully connected!", organizationId);
return responses
.success ( res, outcome.data )
.error ( )
//*** This call is missing from your code.
// It is assumed that 'responses' holds a "Promise", see explanation
;
});
异步编程中的“承诺”是一个尚不知道的值的抽象(将其视为该值的占位符)。有两种可能的基本方案:要么最终将计算该值(#1),要么确定将根本不计算该值(#2)。一个承诺库处理这些情况。参考API使用.then ( fn_ok, fn_fail )
方法来实现诺言对象,该方法以2个函数作为参数,一个与第一个场景相关联,一个与第二个场景相关联。建立方案后,将调用相应的功能。 Promise库可能会添加其他抽象层,可能会从代码示例中产生.success
/ .error
调用。请注意,您保证库通常会支持“链接”:在代码示例中,对.success
(.error
)的调用实际上将确保res
和outcome.data
(什么也没有) )将被保留并馈送到方案#1(#2)的处理程序中,并将返回一个Promise(从技术上讲,是同一对象,并重新定义了一些属性)。
因此,您收到的第二个错误(UnhandledPromiseRejectionWarning
源自于不处理场景2。但是,将来值的计算将失败的情况是非常可能的结果,通常应予以考虑。否则,您的代码会遇到难以跟踪的运行时错误,因为您既不会保证代码段也不会收到错误发生的通知, nor (由于异步编程)代码片段的执行顺序。此外,这种编码风格很容易导致死锁或最终耗尽某些资源(内存,文件句柄等)
此说明是按照(希望)直观的方法故意编写的,并且在技术上有些草率。有关详细说明,请访问https://www.promisejs.org/,MDN: Promises或类似资源。
注意事项
此答案涉及一些猜测。但是,问题起源的总体轮廓仍然有效。