这个异步获取请求在做什么?

时间:2019-04-24 22:54:35

标签: node.js

我正在努力找出此异步函数中的错误。我不断收到此错误消息: “意外的令牌捕获”

,如果该错误已修复,我将收到此错误消息: “未处理的承诺拒绝警告” “弃用警告”

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

1 个答案:

答案 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)的调用实际上将确保resoutcome.data(什么也没有) )将被保留并馈送到方案#1(#2)的处理程序中,并将返回一个Promise(从技术上讲,是同一对象,并重新定义了一些属性)。

因此,您收到的第二个错误(UnhandledPromiseRejectionWarning源自于不处理场景2。但是,将来值的计算将失败的情况是非常可能的结果,通常应予以考虑。否则,您的代码会遇到难以跟踪的运行时错误,因为您既不会保证代码段也不会收到错误发生的通知, nor (由于异步编程)代码片段的执行顺序。此外,这种编码风格很容易导致死锁或最终耗尽某些资源(内存,文件句柄等)

此说明是按照(希望)直观的方法故意编写的,并且在技术上有些草率。有关详细说明,请访问https://www.promisejs.org/MDN: Promises或类似资源。

注意事项

此答案涉及一些猜测。但是,问题起源的总体轮廓仍然有效。