Javascript 回调中的Socket.io-emit给出SyntaxError:JSON输入的意外结束

Javascript 回调中的Socket.io-emit给出SyntaxError:JSON输入的意外结束,javascript,json,node.js,sockets,express,Javascript,Json,Node.js,Sockets,Express,我在一个模块中导出一个回调函数,如下所示: (function() { let request = require("request"); module.exports = function GithubApi(url, callback) { let options = { uri: url, headers: { "User-Agent": "Me",

我在一个模块中导出一个回调函数,如下所示:

(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
        });
    };
}());
JSON.parse(body.body)
当我在express.js的GET请求中使用此回调时,它工作得非常好:

app.get("/", (req, res) => {
    let url = "some url";

    GithubApi(url, (data) => {

        res.render("../some-views", data);
    });
});
但当我添加套接字emit时,回调函数返回SyntaxError:JSON输入的意外结束


无法理解套接字为什么会干扰请求并返回JSON错误。有人能帮忙吗?

可能是因为body.body不包含有效的JSON字符串

当您运行这样的代码时:

(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
        });
    };
}());
JSON.parse(body.body)
您应该始终使用try/catch,因为JSON.parse会对错误的JSON抛出异常

有关更多详细信息,请参见这些答案:


所以问题出在io.sockets.emitupdate,{message:data};。出于某种原因,这干扰了请求,但我仍然不知道为什么如此艰难。我猜这与所有频道的套接字广播有关,这会导致某种错误,请阅读一些关于它的内容

因此,我将对回调函数的调用更改为:

GithubApi(orgs, repo, token, (data) => {

    io.of("/").emit("update", {message: data}); // This line made it work
    res.render("../views/home", data);
});

检查你的JSON它是坏的。是的,我可以看到,但是为什么body.body不包含有效的JSON仅仅因为我在它前面运行了一个套接字?我不明白这会产生什么样的干扰。当我在app.get/…的回调函数中没有套接字发出时,它是一个有效的JSON,但当我添加套接字发出时,body.body会变成无效的JSON。@Jesper为什么body.body不包含有效的JSON?我不知道为什么,我只是说有时候JSON是无效的——这里显然是这样——这就是为什么需要try/catch。你有没有测试body.body实际上包含什么?如果你看到了其中的内容,你可能会得到一些提示,为什么它不是一个有效的JSON。这是对github api的请求,body.body返回一个完全有效的JSON。当我在回调函数中实现socket.emit时,body返回undefined,无法理解套接字为什么会干扰请求。执行了“尝试…抓住困难”,谢谢提示。