【问题标题】:Understanding async function --> Second function runs to soon了解异步函数 --> 第二个函数运行很快
【发布时间】:2020-12-17 17:04:55
【问题描述】:

我调用 API 来获取第二个函数所需的令牌。但是这个运行很快,所以没有数据。 (我得到一个错误,json 意外结束)。在此之后,我打了 4 次矿石电话。我在谷歌应用程序脚本中制作了这个,但漏洞脚本大约需要 17 分钟。所以我想在 NodeJS 中创建它并部署在 firebase 上,然后为应用程序脚本创建一个端点以获取已经准备好的数据。

FIRST 函数

const express = require('express');
const app = express();
const fetch = require('node-fetch'); 
const resid = require('./calls.js');


/*
Here we start with the request to get a new token. And pass this on in the request's later on.
*/
async function getToken() {

    const config = {
        method: 'post',
        headers: {}
    };

    const url = 'https://theapirurl.com';

    const response = await fetch(url, config);
    const json = await response.json();
    const token = json['access_token'];

    await resid.getReservationIds(token);

}

getToken()

第二个函数(calls.js)

const fetch = require('node-fetch'); 

async function getReservationIds(token) {

    const url = "https://theapiurl.com";
    const config = {
        
        method: "get",
        muteHttpExceptions: true,
        headers: {
            "Authorization": "bearer" + token
        }
    };

    const respone = await fetch(url, config);
    const json = await respone.json();

    //console.log(json);

}

module.exports = {
    resid: getReservationIds()
}

我做错了什么?

编辑

现在我得到这个错误:

(node:43371) UnhandledPromiseRejectionWarning: FetchError: invalid json response body at https://apiurlfromcallsjs.com reason: Unexpected end of JSON input
    at /Users/remco/functions/node_modules/node-fetch/lib/index.js:272:32
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at async getReservationIds (/Users/remco/functions/calls.js:20:18)
(node:43371) 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(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)
(node:43371) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
(node:43371) UnhandledPromiseRejectionWarning: TypeError: getReservationIds is not a function
    at getToken (/Users/remco/functions/index.js:23:11)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
(node:43371) 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(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 3)

【问题讨论】:

    标签: node.js async-await fetch fetch-api


    【解决方案1】:

    您正在立即调用第二个函数,而不是等待第一个函数完成:

    module.exports = {
        resid: getReservationIds()
    }
    

    所以当你运行时

    const resid = require('./calls.js');
    

    此时,第二个函数已经在运行(resid.getReservationIds 是一个 Promise,而不是一个函数)。

    只导出函数:

    module.exports = getReservationIds;
    

    然后导入并调用它:

    const getReservationIds = require('./calls.js');
    // ...
      await getReservationIds(token);
    

    【讨论】:

    • 嗨@CertainPerformance 现在我收到一个错误,我粘贴在原始帖子中。但是你上面的遮阳篷是有道理的,谢谢!
    • 当我在 calls.js 中将令牌作为 const 传递时,它就像一个魅力。到目前为止,当 getReservationIds 运行时,我可以告诉令牌是未定义的。
    • 如果未定义 token,则 json['access_token'] 中不存在任何内容。检查响应以找出获取令牌所需访问的正确属性。
    • 另请注意,要设置授权标头,您需要在令牌之前的Bearer 之后有一个空格——也就是说,您可能想要"Authorization": "Bearer " + token
    • 当我在调用 getReservationId 之前记录令牌时,我首先得到上面的错误,然后是终端中的令牌。 (令牌正确且有效)所以我认为 getReservationId 在 getToken 完成之前正在运行。就像我说的。如果我在 getReservationId 函数中将令牌作为 const 传递并执行:node calls.js 它可以工作
    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 2021-12-09
    • 1970-01-01
    相关资源
    最近更新 更多