所以我在这样的模块中导出一个回调函数:
(function() {
let request = require("request");
module.exports = function GithubApi(url, callback) {
let options = {
uri: url,
headers: {
"User-Agent": "Me",
"Content-Type": "application/x-www-form-urlencoded"
}
};
request(options, function(err, body) {
let context = {
issues: JSON.parse(body.body).map(function(issue) {
return {
title: issue.title,
comments: issue.comments,
};
})
};
callback(context) // The callback
});
};
}());
当我在使用express.js的GET请求中使用它时,此回调非常正常:
app.get("/", (req, res) => {
let url = "some url";
GithubApi(url, (data) => {
res.render("../some-views", data);
});
});
但是当我添加socket-emit时,callback-function返回SyntaxError: Unexpected end of JSON input
app.get("/", (req, res) => {
let url = "some url";
GithubApi(url, (data) => {
io.socket.emit("update", {message: data}); // adding this
res.render("../some-views", data);
});
});
无法理解套接字会干扰请求并使用JSON返回错误的原因。有人可以帮忙吗?
答案 0 :(得分:1)
问题必须由body.body
不包含有效JSON字符串的事实引起。
当你运行这样的代码时:
JSON.parse(body.body)
你应该总是使用try / catch,因为JSON.parse
会在糟糕的JSON上抛出异常。
有关详细信息,请参阅这些答案:
答案 1 :(得分:0)
所以问题在于io.sockets.emit("update", {message: data});
。出于某种原因,这干扰了请求(仍然不知道为什么很难)。我想它与广播到所有频道的套接字有关,这会导致某种错误,请阅读有关它的信息here。
所以我把对callback-function的调用更改为:
GithubApi(orgs, repo, token, (data) => {
io.of("/").emit("update", {message: data}); // This line made it work
res.render("../views/home", data);
});