![](/img/trans.png)
[英]Keep getting 'Error sending test message to Cloud PubSub…' with Google Cloud PubSub
[英]Google Cloud Function Error - PubSub to BigQuery
我创建了一个带有 Pub/Sub 触发器(由 Stackdriver 接收器触发)的 Google Cloud Function。 然后它会更改此数据的格式并将其保存到 BigQuery。
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();
const environment= process.env.ENVIRONMENT || 'Dev';
insertIntoBigQueryClient = async (locationObject) => {
const metadata = locationObject.jsonPayload.metadata;
const row = [{
driverId: metadata.driverId,
driverPhone: metadata.driverPhone,
driverStatus: metadata.driverStatus,
driverLocation: metadata.driverLocation.coordinates,
timestamp: locationObject.timestamp
}];
// Insert data into a table
return await bigquery
.dataset(`YassirBackendLogging${environment}`)
.table('DriverLocationStatus')
.insert(row);
};
driverLocationStatusProcessing = async (pubSubEvent, context) => {
try {
const logObject = JSON.parse(Buffer.from(pubSubEvent.data, 'base64').toString());
insertIntoBigQueryClient(logObject);
} catch(error){
console.error(error);
}
};
// this part is only to have multi functions. one for each envirenment
switch (environment) {
case 'Prod' :
exports.driverLocationStatusProcessingProd = async (pubSubEvent, context) => {
await driverLocationStatusProcessing(pubSubEvent, context);
};
break;
case 'Dev' :
exports.driverLocationStatusProcessingDev = async (pubSubEvent, context) => {
await driverLocationStatusProcessing(pubSubEvent, context);
};
break;
default :
exports.driverLocationStatusProcessingDev = async (pubSubEvent, context) => {
await driverLocationStatusProcessing(pubSubEvent, context);
};
break;
}
这是云构建代码
steps:
- name: 'gcr.io/cloud-builders/gcloud'
args:
- functions
- deploy
- 'driverLocationStatusProcessing$_ENVIRONMENT'
- '--set-env-vars'
- ENVIRONMENT=$_ENVIRONMENT
- '--trigger-topic'
- 'DriverLocationStatus$_ENVIRONMENT'
- '--runtime'
- nodejs8
- '--timeout=540'
dir: 'driver-location-status'
现在,这个 function 工作正常,但有时会出现一些不知从何而来的错误。 如下所示:
错误:无法加载默认凭据。 浏览到https://cloud.google.com/docs/authentication/getting-started了解更多信息。 在 GoogleAuth.getApplicationDefaultAsync (/srv/node_modules/google-auth-library/build/src/auth/googleauth.js:161:19) 在 process._tickDomainCallback (internal/process/next_tick.js:229:7)
错误:function 因请求而崩溃 scope Function 无法执行。
我希望我能就此事得到一些反馈。 也许与异步任务有关?
这看起来像是您的driverLocationStatusProcessing
function 中的潜在逻辑错误:
try {
...
return insertIntoBigQueryClient(logObject);
// ^^ add return statement
我不确定这是否是您的问题的原因,但您的评论指出了潜在的竞争条件(“它像百万分之一一样发生”)并且没有那个return
, await
不会做你期望它做的事情.
这也可能是相关的:无法加载默认凭据? (Node.js 谷歌计算引擎教程)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.