等效的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()
存在于某处 ,否则这种事情将继续发生。
如果不需要所有这些明确的处理,那将是可爱的,但是这对于承诺库是不可能的。 也许土生土长的承诺将在未来允许。