异步函数 returns 200 不执行

Async function returns 200 without executing

我有一个用 Node JS 编写的 Cloud Function,它从 BigQuery 访问数据,将其转换为 CSV 并导出到 Google 存储桶。

目前它执行 returns 一个 200,但不 运行 我的 try/catch.

中的任何代码

测试时 returns:

Function execution took x ms. Finished with status code: 200

我尝试通过在不同点添加控制台日志来进行调试,但它没有记录任何内容 - 它只是 returns 一个 200。

exports.run_checks = (req, res) => {
  "use strict";
  let parsedBody = req.body;
  let startCount = parsedBody.start;
  let endCount = parsedBody.end;
  (async function () {
    try {
      for (let i = startCount; i < endCount; i += 1) {
        //Exclude overly large files here 
        if (i != 100) {
          const query =
            `SELECT *
      FROM \`bq_dataset\`
      WHERE id_number = ${i}`;
          const options = {
            query: query,
            location: "europe-west2",
          };
          const [job] = await bigquery.createQueryJob(options);
          console.log(`Job ${job.id} started.`);
          const [rows] = await job.getQueryResults();
          let id = rows[0].id;
          const createFile = storage.bucket(bucketName).file(`${id}.csv`);
          const csv = parse(rows, { fields });

          const dataStream = new stream.PassThrough();
          dataStream.push(csv);
          dataStream.push(null);
          await new Promise((resolve, reject) => {
            console.log(`Writing ${id} to GCS`);
            dataStream
              .pipe(
                createFile.createWriteStream({
                  resumable: false,
                  validation: false,
                  metadata: { "Cache-Control": "public, max-age=31536000" },
                })
              )
              .on("error", (error) => {
                console.error("Stream failed", error);
                reject(error);
              })
              .on("finish", () => {
                resolve(true);
              });
          });
        }
      }
      res.status(200).send();
    } catch (err) {
      res.send(err);
    }
  })();
};

你的函数是不是异步的。宿主不知道你还在做你的函数,它returns没有任何错误。

把你的箭头函数改成async,不用IIFE,删掉,await,也很重要!

exports.run_checks = async (req, res) => {
  "use strict";
  let parsedBody = req.body;
  let startCount = parsedBody.start;
  let endCount = parsedBody.end;
    try {
      for (let i = startCount; i < endCount; i += 1) {
        //Exclude overly large files here 
        if (i != 100) {
          const query =
            `SELECT *
      FROM \`bq_dataset\`
      WHERE id_number = ${i}`;
          const options = {
            query: query,
            location: "europe-west2",
          };
          const [job] = await bigquery.createQueryJob(options);
          console.log(`Job ${job.id} started.`);
          const [rows] = await job.getQueryResults();
          let id = rows[0].id;
          const createFile = storage.bucket(bucketName).file(`${id}.csv`);
          const csv = parse(rows, { fields });

          const dataStream = new stream.PassThrough();
          dataStream.push(csv);
          dataStream.push(null);
          await new Promise((resolve, reject) => {
            console.log(`Writing ${id} to GCS`);
            dataStream
              .pipe(
                createFile.createWriteStream({
                  resumable: false,
                  validation: false,
                  metadata: { "Cache-Control": "public, max-age=31536000" },
                })
              )
              .on("error", (error) => {
                console.error("Stream failed", error);
                reject(error);
              })
              .on("finish", () => {
                resolve(true);
              });
          });
        }
      }
      res.status(200).send();
    } catch (err) {
      res.send(err);
    }
};