2

我已经使用 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 请求。

我不知道这是怎么回事,我仔细检查了我的谷歌设置,我找不到那里有什么问题。此外,在我的服务器上使用具有相同 api 密钥的 Google Places APi 也没有问题。

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

4

3 回答 3

3

好吧,我终于发现了问题所在:新版本的RequestJS不能像旧版本那样工作,而我的服务器运行的是 2.16,而我的本地机器运行的是 2.14。

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

key=my_api_key&target=en&q=Mon%20premier%20essai&q=Mon%20second%20essai

新版本发送时

key=my_api_key&target=en&q[0]=Mon%20premier%20essai&q[1]=Mon%20second%20essai

所以我现在只是在我的 package.json 文件中添加了 2.14.x 而不是 2.x,希望它会很快得到修复——或者它可能不是一个错误?我不知道。

于 2013-04-26T14:49:30.270 回答
3

这个答案有点晚了,但可以帮助人们解决这个问题。问题来自于查询字符串模块转换数组参数的方式:

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")
    }
});

显然这不是很干净,但是您可以轻松地创建一个实用函数,以您希望的方式从对象创建正文字符串。

于 2014-03-24T18:49:52.623 回答
0

突然出现在我脑海中的事情:

  • 服务器和本地PC上的jquery文件版本不一样
  • 文件编码问题(服务器上 PC ascii 上的 UTF8?)
  • 您是否尝试在打开开发者工具的情况下使用 chrome 对其进行测试,然后检查“网络选项卡”并准确验证发送给 Google 的内容。

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

祝你好运!

于 2013-04-25T00:35:08.723 回答