【问题标题】:HTTP request to a google service returns Error: read ECONNRESET firebase cloud functions对谷歌服务的 HTTP 请求返回错误:读取 ECONNRESET firebase 云函数
【发布时间】:2018-05-11 21:35:07
【问题描述】:

我正在尝试使用 google translate api 将用户的名称从英语翻译成印度语言,并使用云功能将数据存储回实时数据库中。

此函数由写入数据库调用,我使用 HTTP POST 请求向云翻译 api 发送请求,并将响应存储回数据库。我的翻译请求代码是这样的。

var translate_options = { method: 'POST',
                                  url: 'https://translation.googleapis.com/language/translate/v2',
                                  qs:
                                   { key: 'key goes here',
                                    },
                                    form: {
                                      q: fullData.name,
                                      target: "te"
                                    },
                                  };

                    request(translate_options, function (error, translate_response, translate_body) {
             if (error){
                          console.log("In translating, got an error");
                          console.log(error);
             }
             // Query to the database goes here.

  });

如果在我的笔记本电脑上尝试此代码,我会得到正确的翻译,但如果我将其部署为云功能,则会出现错误。很具体

{ Error: read ECONNRESET
    at exports._errnoException (util.js:1020:11)
    at TLSWrap.onread (net.js:568:26) code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }

我正在执行 firebase blaze 计划,我可以将 POST 请求发送到我的其他服务,但不能发送到 Google 服务。

谁能帮我解决这个问题。提前致谢。

编辑:

完整代码是

var functions = require('firebase-functions');
var admin = require('firebase-admin');
var request = require("request");

admin.initializeApp(functions.config().firebase);


exports.whenUserIsAdded = functions.database.ref('users/{companyId}/{uid}').onCreate(event => {

var fullData = event.data.val();


var lang_code = {
  "bengali": "bn",
  "telugu": "te",
  "english": "en"
}

var lang_var = lang_code[fullData['edition']];


var translate_options = { method: 'POST',
              url: 'https://translation.googleapis.com/language/translate/v2',
              qs:
               { key: 'Key goes here',
                },
                form: {
                  q: fullData.name,
                  target: lang_var
                },
              };

request(translate_options, function (error, translate_response, translate_body) {
   var farmer_name = "";
   if(error){
        console.log("There is an error in translation");
        console.log(error);
   }
  translate_body = JSON.parse(translate_body);

  if(translate_body.data.translations){
    farmer_name = translate_body.data.translations[0].translatedText;
    console.log("The farmer name is " + fullData.name +"  :  " + farmer_name);
    // Code to write to the database;
  } else{
    console.log("The translation failed");
    farmer_name = fullData.name;
    console.log("The famrer name is  " + farmer_name);
  }

})

});

【问题讨论】:

  • 您能否展示以这种方式失败的函数的完整最小代码?你可能做错了什么。
  • 实际上,这是唯一正在使用的代码。但是,它从早上开始工作。我没有更改任何代码,没有更新,我只是保持原样。它今天工作,但昨天没有工作。
  • 这不可能是唯一的一段代码,因为它不包含 Cloud Function 模块导出的函数定义。请展示整个函数。
  • 我添加了完整的代码。您能否验证并告诉我错误。此外,该功能昨天工作,今天不工作。我再次遇到同样的错误。此外,我正在将翻译后的输出记录到 slack 以通知各自的团队。为此,我必须发送一个正在发生的 POST 请求。但我无法将请求发送到 Google Translate API。这是隔天发生的。
  • 我面临着类似的问题。我也在尝试谷歌翻译。

标签: firebase firebase-realtime-database google-cloud-functions firebase-cloud-functions


【解决方案1】:

当你的函数的所有工作都完成时,你不会返回一个已经解决的承诺。如果工作在过去完成,那可能只是意味着你很幸运。在不返回承诺的情况下,Cloud Functions 可能会在函数返回时终止并清理任何未完成的工作。正确返回 Promise 将阻止 Cloud Functions 在工作完成之前进行清理。

请考虑阅读我的blog post about this。有一个专为 ECONNRESET 准备的部分。

【讨论】:

  • 但是在这里,我传递的是回调函数而不是承诺。所以应该没有问题吧?
  • 你没有返回你的函数的承诺。实际上,您根本没有返回任何东西。
  • 是的,但是,在回调中,body 必须是来自 google translate api 的响应,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 2017-12-24
  • 2017-11-09
  • 2018-03-30
  • 2015-01-07
  • 2022-11-11
相关资源
最近更新 更多