在 Google 云函数 (Node-JS) 中等待数据存储回调
Wait for Datastore callback in Google Cloud Functions (Node-JS)
我正在开发一个 Google Cloud Functions,它调用数据流作业并将数据流作业的 ID 存储在数据存储中。这部分工作完美。
我的问题出在读取数据存储区的另一个 Cloud Function(通过 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 );
})
这是因为您在收到结果之前发送了回复。 res.status().send()
执行后,Cloud Functions 将限制您函数的资源并清理它,可能会终止任何仍在进行中的异步工作。
您需要等到所有异步工作完成后再发送响应。这意味着您可能应该将响应移动到数据存储承诺的 then
和 catch
块中,以便仅在工作完成后发送响应。
我正在开发一个 Google Cloud Functions,它调用数据流作业并将数据流作业的 ID 存储在数据存储中。这部分工作完美。
我的问题出在读取数据存储区的另一个 Cloud Function(通过 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 );
})
这是因为您在收到结果之前发送了回复。 res.status().send()
执行后,Cloud Functions 将限制您函数的资源并清理它,可能会终止任何仍在进行中的异步工作。
您需要等到所有异步工作完成后再发送响应。这意味着您可能应该将响应移动到数据存储承诺的 then
和 catch
块中,以便仅在工作完成后发送响应。