【问题标题】:Wait for Datastore callback in Google Cloud Functions (Node-JS)在 Google Cloud Functions (Node-JS) 中等待 Datastore 回调
【发布时间】:2018-06-25 14:10:39
【问题描述】:

我正在开发一个调用数据流作业并将数据流作业的 ID 存储在数据存储区中的 Google Cloud Functions。这部分工作完美。

我的问题出在另一个读取数据存储区的云函数(通过 HTTP 触发)上。云函数似乎是完全异步的,并且在数据存储函数发送一些数据之前结束。

我从原始 node-js 数据存储 api https://github.com/googleapis/nodejs-datastore/blob/master/samples/tasks.js 中获取了数据存储示例

我的代码:

exports.processJobs = (req, res) => {
jobList = "";
console.log(`  INIT processJobs`);
const query = datastore.createQuery('Job').filter('finished', '=', false);
datastore
.runQuery(query)
.then(results => {
    const jobs = results[0];

    console.log('Jobs:');
    jobs.forEach(job => {
        const jobKey = job[datastore.KEY];
        console.log(jobKey, job);
        jobList = jobList + job.jobId;
    });
})
.catch(err => {
    console.error('ERROR:', err);
});
console.log(`  END processJobs`);
res.status(200).send(":" + jobList);
}

如果我按照我的函数生成的日志显示该函数结束,然后它将作业显示到控制台中:

2018-06-25 13:58:00.496  Function execution took 384 ms, finished with status code: 200
2018-06-25 13:59:14.774  Jobs:
2018-06-25 13:59:16.191  undefined { jobId: '2018-06-25_01_07_33-9128665201904101921',
                                                         beginTime: 2018-06-25T08:07:34.980Z,
                                                         finished: false,
                                                         status: 'JOB_STATE_RUNNING' }

更新:

解决方案正在将响应移动到解决方案中要求的“then”部分:

datastore
.runQuery(query)
.then(results => {
    const jobs = results[0];
    console.log('Jobs:');
    jobs.forEach(job => {
        const jobKey = job[datastore.KEY];
        console.log(jobKey.id, job);
        jobList = jobList + job.jobId;

    });
    res.status(200).send("Response:_" + jobList );
})

【问题讨论】:

    标签: node.js google-cloud-datastore google-cloud-functions google-cloud-dataflow


    【解决方案1】:

    这是因为您在收到结果之前发送了响应。在res.status().send() 执行后,Cloud Functions 将限制您函数上的资源并对其进行清理,可能会终止任何仍在进行中的异步工作。

    您需要等到所有异步工作完成后再发送响应。这意味着您可能应该将响应移动到数据存储承诺的 thencatch 块中,以便仅在工作完成后发送响应。

    See the documentation for more information 和示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 2020-08-06
      相关资源
      最近更新 更多