Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Google云函数错误-PubSub到BigQuery_Javascript_Google Cloud Platform_Google Bigquery_Google Cloud Functions - Fatal编程技术网

Javascript Google云函数错误-PubSub到BigQuery

Javascript Google云函数错误-PubSub到BigQuery,javascript,google-cloud-platform,google-bigquery,google-cloud-functions,Javascript,Google Cloud Platform,Google Bigquery,Google Cloud Functions,我创建了一个带有Pub/Sub触发器(由Stackdriver接收器触发)的Google云函数。然后,它更改此数据的格式并将其保存到BigQuery const {BigQuery} = require('@google-cloud/bigquery'); const bigquery = new BigQuery(); const environment= process.env.ENVIRONMENT || 'Dev'; insertIntoBigQueryClient = async

我创建了一个带有Pub/Sub触发器(由Stackdriver接收器触发)的Google云函数。然后,它更改此数据的格式并将其保存到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'

现在,这个函数工作得很好,但有时会出现一些错误。例如:

错误:无法加载默认凭据。浏览以了解更多信息。 位于GoogleAuth.getApplicationDefaultAsync(/srv/node_modules/google auth library/build/src/auth/GoogleAuth.js:161:19) 在 在进程中。_tickDomainCallback(internal/process/next_tick.js:229:7)

错误:函数在请求范围外崩溃 无法执行此函数


我希望我能得到一些关于这件事的反馈。可能与异步任务有关

这看起来像是
driverLocationStatusProcessing
函数中的潜在逻辑错误:

试试看{
...
返回insertIntoBigQueryClient(logObject);
//^^添加返回语句
我不确定这是否是您的问题的原因,但您的评论指出了潜在的竞争条件(“它像百万分之一的情况发生”),如果没有
return
wait
,它将不会做您期望的事情


这也可能与此相关:

这看起来像是
驱动器位置StatusProcessing
功能中的潜在逻辑错误:

试试看{
...
返回insertIntoBigQueryClient(logObject);
//^^添加返回语句
我不确定这是否是您的问题的原因,但您的评论指出了潜在的竞争条件(“它像百万分之一的情况发生”),如果没有
return
wait
,它将不会做您期望的事情


这也可能与此相关:

1)绝不允许您的代码在云函数中崩溃。始终实现try/catch和错误处理逻辑。2)无法加载凭据可能是一个网络问题(暂时的Google问题)或者代码中存在逻辑问题。2)我会修改代码以直接获取ADC凭据并验证它们。如果凭据无效,请退出。发布/订阅将稍后重试。3)编写代码以假设失败并处理失败、重试、超时等。这将帮助您更好地了解问题的根源。4)Node.js非常流行ar但我不会在Node.js.Go中编写云函数,Python使程序更简单,更易于调试(我在编写了数千个函数后的观点)。我解决了未经处理的拒绝问题。但考虑到凭证问题,这不是一个代码问题。它像百万分之一的事件一样发生,但它确实困扰着我。因为我负担不起丢失数据。我希望有一种解决方法。我提供了关于如何处理此问题的建议(第2项和第3项)。请记住,捕获错误与设计逻辑以检测错误并从错误中恢复不同。好的,谢谢你的建议。它们非常有用。我现在单独处理错误,似乎问题并不真正存在于我的代码中。在我修改了其中一个函数的内存参数并添加了修复nu之后实例数增加到50。问题解决了。我总共有5个函数。2个函数每3秒执行一次,其他的每秒执行200次。所以我测试了我的理论,它成功了。你怎么看?1)永远不要让你的代码在云函数中崩溃。始终实现try/catch和错误处理逻辑。2)无法load凭据可能是网络问题(暂时的Google问题)或者代码中存在逻辑问题。2)我会修改代码以直接获取ADC凭据并验证它们。如果凭据无效,请退出。发布/订阅将稍后重试。3)编写代码以假设失败并处理失败、重试、超时等。这将帮助您更好地了解问题的根源。4)Node.js非常流行ar但我不会在Node.js.Go中编写云函数,Python使程序更简单,更易于调试(我在编写了数千个函数后的观点)。我解决了未经处理的拒绝问题。但考虑到凭证问题,这不是一个代码问题。它像百万分之一的事件一样发生,但它确实困扰着我。因为我负担不起丢失数据。我希望有一种解决方法。我提供了关于如何处理此问题的建议(第2项和第3项)。请记住,捕获错误与设计逻辑以检测错误并从错误中恢复不同。好的,谢谢你的建议。它们非常有用。我现在单独处理错误,似乎问题并不真正存在于我的代码中。在我修改了其中一个函数的内存参数并添加了修复nu之后从实例数到50个。问题解决了。我总共有5个函数。2个函数每3秒执行一次,其他的每秒执行200次。所以我测试了我的理论,它成功了。你觉得怎么样?哦,真的谢谢你。我忘了返回。但是即使没有返回,在将内存从256MB增加到1GB之后实例数增加到50,我完全解决了这个问题。但我想我会再次减少内存并添加return语句,看看会发生什么。你觉得怎么样?ohhh非常感谢。我忘记了返回。但是即使没有返回,在将内存从256MB增加到1GB,实例数增加到50之后,我完全解决了这个问题。但我想我会再次减少内存并添加return语句,看看会发生什么。你怎么看?