等效的GET请求在节点环境和浏览器中不显示相同的结果

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

下面是我在浏览器中使用jquery代码,并在terminal。

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

据我所知,节点确实可以识别这些表情符号 – 请参见截图

在这里输入图像说明

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

看起来问题不在于使用表情符号,因为如果我尝试将callback函数中的代码更改为下面的代码,节点中仍然没有显示任何内容,但是在浏览器控制台中显示了一个数组。

 console.log(showEmoji.grinning.keywords); 

问题是data不是一个string,它是一个描述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( ... )调用你的承诺,以提醒你什么时候这种事情发生。 (还有一个常见的callback.done()但承诺似乎并不支持它)。

它没有工作的原因是JSON.parse函数失败 – 但是Node没有告诉你的原因是.then()callback中的exception不会显示给用户。 它们被存储并传入.catch()callback.catch()或者在调用.done() .catch()时抛出。 一般来说,你不应该使用.catch() .then()而不是.catch()存在于某处 ,否则这种事情将继续发生。

如果不需要所有这些明确的处理,那将是可爱的,但是这对于承诺库是不可能的。 也许土生土长的承诺将在未来允许。