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

时间:2016-03-31 07:45:05

标签: javascript ajax node.js

我开始深入研究node.js并且正在使用termianl。我正在使用GET节点包https://www.npmjs.com/package/got

发出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);
 })

按照我的预期在broswer的控制台中显示 - 一切都很好。

然后,当我在节点环境中编写等效代码时,不会显示任何内容。

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

据我所知,节点确实识别这些表情符号 - 见截图

enter image description here

任何人都可以解释为什么结果不一样吗?我错过了一些简单而明显的东西吗?

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

console.log(showEmoji.grinning.keywords);

1 个答案:

答案 0 :(得分:3)

问题是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()回调或抛出。一般情况下,如果没有.then()现有某处,就不应该使用.catch(),否则这类事情会继续发生。

如果不需要所有这些显式处理,那将是可爱的但是使用promise库是不可能的。也许本土的承诺将来会允许它。