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

时间:2017-03-10 14:12:41

标签: 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",
                "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返回错误的原因。有人可以帮忙吗?

2 个答案:

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