【问题标题】:equivalent GET request in node environment and browser not showing the same results节点环境和浏览器中的等效 GET 请求不显示相同的结果
【发布时间】:2016-07-19 12:57:06
【问题描述】:

我开始更深入地研究 node.js 并在 termianl 中玩耍。我正在发出GET 请求,使用got 节点包https://www.npmjs.com/package/got

以下是我在浏览器中使用jquery 和在终端中使用got 的代码。

jQuery 代码

$.get('https://raw.githubusercontent.com/notwaldorf/emoji-translate/master/bower_components/emojilib/emojis.json', function (data) {
   var showEmoji = JSON.parse(data)
   console.log(showEmoji.grinning.char);
 })

正如我所料,这在浏览器的控制台中显示????——一切都很好。

然后我在node环境下写等效代码的时候,什么都没有显示出来。

Node.js 代码

var got = require("got");
var url = 'https://raw.githubusercontent.com/notwaldorf/emoji-translate/master/bower_components/emojilib/emojis.json'
got(url).then(function(data){
    var showEmoji = JSON.parse(data)
    console.log(showEmoji.grinning.char);
});

据我所知,node 确实可以识别这些表情符号——见截图

谁能解释为什么结果不一样?我错过了一些简单明了的东西吗?

似乎问题与表情符号无关,好像我尝试将回调函数中的代码更改为以下代码,节点中仍然没有显示任何内容,但浏览器控制台中显示了一个数组。

console.log(showEmoji.grinning.keywords);

【问题讨论】:

  • 你可以尝试在节点中console.log("????") 吗?
  • 见附件截图
  • 你在控制台使用的字体不支持表情?
  • @KrzysztofSafjanowski 为什么要进行此编辑?
  • @KrzysztofSafjanowski 好吧,这不是 OP 代码......而且 OP 也不是关于 jQuery 而是关于 nodejs

标签: javascript ajax node.js


【解决方案1】:

问题在于data 不是字符串,它是描述HTTP 请求的丰富对象。此代码有效:

var got = require("got");
var url = 'https://raw.githubusercontent.com/notwaldorf/emoji-translate/master/bower_components/emojilib/emojis.json'
got(url).then(function(data){
    var showEmoji = JSON.parse(data.body);
    console.log(showEmoji.grinning.char);
});

...但是您确实应该在您的承诺中添加.catch( ... ) 调用,以便在发生此类事情时提醒您。 (还有一个常见的回调 .done(),但来自 got 的承诺似乎不支持它。)

它不起作用的原因是 JSON.parse 函数失败了——但 Node 没有告诉你的原因是 .then() 回调中的异常没有显示给用户。它们被存储并传递给.catch() 回调或在您调用.done() 时抛出。一般来说,你不应该在没有.catch()存在的情况下使用.then()somewhere,否则这种事情会继续发生。

如果不需要所有这些显式处理,那就太好了,但对于 Promise 库,这是不可能的。也许原生承诺会在未来允许它。

【讨论】:

  • 行得通,谢谢!但是,我仍然不明白为什么相同的请求在浏览器和终端中的工作方式不同。似乎没有返回相同的数据。如果我在终端中执行console.log(typeof data),它会返回对象,但在浏览器中它会返回string
  • @Andrew Taylor,你能解释一下为什么它在节点中返回一个object,而在浏览器中返回一个string
  • @PaulFitzgerald 请求的工作方式完全相同——不同之处在于您在浏览器中使用 jQuery 并在 Node 上使用。 jQuery 被编程为返回正文文本,因为它的开发人员可能认为这对您最有帮助,而 Got 的开发人员显然认为您可能需要更多关于请求的信息,因此编程 Got 来提供它。两者都没有错——你只需要确保你的代码是正确的。
猜你喜欢
  • 2018-04-27
  • 2022-01-04
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 2018-06-06
相关资源
最近更新 更多