NodeJS / Express 函数仅在 Google 云函数中被调用一次

NodeJS / Express function only invoked one time in Google Cloud functions

我正在创建一个 google 云功能,每天向用户发送一封电子邮件,但该功能仅在部署后第一次调用,然后即使在 300 秒后也总是失败并超时(通常需要 10 - 执行 15 秒)。

该函数正在执行数据库查找、for 循环和 if 条件,所以我认为这是来自应用程序的请求/响应的问题,因此它会阻止将来的调用。你能帮我修改下面的代码吗?

app.get('/emails', function(req, res){
    var books = [];
    Book.find({}, (err, res) => {
       if (err) {
           return err;
       }
       books = res;
   }).catch(err => console.log(err))
   User.find({}, (err, users) => {
    if (err) {
        return err;
    }

    const uniques = users.filter(
      (v, i, a) => a.findIndex((t) => t.ID === v.ID) === i
    );

    for(var i =0; i < uniques.length; i++) {
      var count = 0;
      for (var j = 0; j < books.length; j++) {
        if (books[j].UserID === uniques[i].ID && books[j].State === "OK") {
          count += 1;
        }
      }
      var EmailPayload = {
          // nodemailer object here
    }
    if (count > 0) {
      Email.sendEmailIndex(EmailPayload);
    }
    } 
  }).catch(err => {
    console.log(err)
  })
  });

该函数正在由 GET /emails 调用,它需要一个响应。如果没有响应,该函数将保持 运行 直到超时,因为 Google 不知道它已完成。

要解决此问题,请在脚本完成后以基本 200 结束。在未能涵盖所有情况的情况下做出回应并确保始终发回回应也是明智的。

app.get('/emails', function(req, res) {
    var books = [];
    Book.find({}, (err, res) => {
        if (err) {
            return err;
        }
        books = res;

        return User.find({}, (err, users) => {
            if (err) {
                return err;
            }

            const uniques = users.filter(
                (v, i, a) => a.findIndex((t) => t.ID === v.ID) === i
            );

            for (var i = 0; i < uniques.length; i++) {
                var count = 0;
                for (var j = 0; j < books.length; j++) {
                    if (books[j].UserID === uniques[i].ID && books[j].State === "OK") {
                        count += 1;
                    }
                }
                var EmailPayload = {
                    // nodemailer object here
                }
                if (count > 0) {
                    Email.sendEmailIndex(EmailPayload);
                }
            }

            // Send a response to conclude function execution
            res.status(200).send({
                message: 'Emails sent'
            });
        });
    }).catch(err => {
        console.log(err);

        // Send a response to conclude function execution
        res.status(500).send({
            message: 'Failed to send emails',
            error: err
        });
    })
});