Google Translate API始终返回“必需参数:q”作为错误

时间:2013-04-16 14:00:56

标签: node.js google-api google-translate

我一直在使用谷歌翻译API一段时间,没有任何问题。 我最近将我的应用程序推送到我的新服务器,即使它在我的本地服务器上运行完美,相同的源代码总是给我“必需参数:q”作为错误消息。

我正在使用NodeJS + ExpressJS + Request发送此请求。这是我的测试用例:

  var request = require('request');
  request.post({
    url: "https://www.googleapis.com/language/translate/v2",
    headers: {"X-HTTP-Method-Override": "GET"},
    form: {
      key: /* My Google API server key */,
      target: "en",
      q: ["Mon premier essai", "Mon second essai"]
    }
  }, function(error, response, data) {
    if (!error && response.statusCode == 200) {
      console.log("everything works fine");
    } else {
      console.log("something went wrong")
    }
  });

在我的本地计算机上运行会让我“一切正常”,在我的服务器上运行它会让我“出错”。进一步深入研究,我得到上面提到的错误信息。 正如你所看到的,我试图在一个请求中翻译两句话。这只是一个测试用例,但我确实需要通过POST请求使用它而不是做两个GET请求。

我不知道发生了什么,我仔细检查了我的Google设置,我找不到有什么问题。 此外,我在使用Google Places APi在我的服务器上使用相同的api密钥时也没有问题。

我被困住了。任何人都知道这里有什么问题吗?

3 个答案:

答案 0 :(得分:3)

好吧,我终于发现了什么问题: RequestJS 的新版本不能用作旧版本,当我的本地机器运行2.14时,我的服务器运行2.16。

不同之处在于数组的发送方式。我调试了,旧版本正在发送

  

键= my_api_key&安培;目标= EN&安培; Q =周一%20premier%20essai&安培; Q =周一%20秒%20essai

新版本发送时

  

键= my_api_key&安培;目标= EN&安培; Q [0] =星期一%20premier%20essai&安培; Q [1] =星期一%20秒%20essai

所以我刚刚在package.json文件中添加了2.14.x而不是2.x,希望它很快就会修复 - 或者它可能不是bug?我不知道。

答案 1 :(得分:3)

这个答案有点晚,但要帮助那些有这个问题的人。问题来自querystring模块转换数组参数的方式:

https://github.com/visionmedia/node-querystring

它的函数qs.stringify将具有数组值的字段名(在给定示例中为q)转换为以下格式:

Q [0] = .. Q [1] = ...

这不是错误,而是预期的功能。要在不恢复旧版本的请求模块的情况下解决此问题,您需要使用body选项而不是form选项手动创建帖子。此外,您还需要使用此方法手动添加内容类型标头:

var request = require('request');
request.request({
    url: "https://www.googleapis.com/language/translate/v2",
    headers: {
        "X-HTTP-Method-Override": "GET",
        'content-type':'application/x-www-form-urlencoded; charset=utf-8'
    },
    body:'key=xxxx&target=en&q=q=Mon%20premier%20essai&q=Mon%20second%20essai'
}, function(error, response, data) {
    if (!error && response.statusCode == 200) {
        console.log("everything works fine");
    } else {
        console.log("something went wrong")
    }
});

显然这不是很干净,但你可以轻松创建一个实用程序函数,以你想要的方式从对象创建正文字符串。

答案 2 :(得分:0)

突然出现的事情:

  • 服务器和本地PC上的jquery文件版本不一样
  • 文件编码问题(服务器上的PC ascii上的UTF8?)
  • 您是否尝试使用Chrome打开开发人员工具对其进行测试,然后选中“网络标签”并确切确认发送给Google的内容。

至少对我来说,当它在一台机器而不是另一台机器上工作时,通常是由于前两个选项。

祝你好运!