【问题标题】:Socket.io-emit in callback gives SyntaxError: Unexpected end of JSON input回调中的 Socket.io-emit 给出 SyntaxError: Unexpected end of JSON input
【发布时间】:2017-07-31 22:02:04
【问题描述】:

所以我在这样的模块中导出回调函数:

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

当我在我的 GET 请求中使用 express.js 时,这个回调工作得非常好:

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

    GithubApi(url, (data) => {

        res.render("../some-views", data);
    });
});

但是当我添加一个socket-emit时,回调函数返回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 错误。有人可以帮忙吗?

【问题讨论】:

  • 检查你的 JSON 是否有问题。

标签: javascript json node.js sockets express


【解决方案1】:

这可能是由于body.body 不包含有效的JSON 字符串。

当你运行这样的代码时:

JSON.parse(body.body)

您应该始终使用 try/catch,因为 JSON.parse 会在错误的 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-body 返回未定义,并且无法理解为什么套接字会干扰请求。是否实施了 try...catch,感谢您的提示。
【解决方案2】:

所以问题出在io.sockets.emit("update", {message: data});。出于某种原因,这干扰了请求(仍然不知道为什么很难)。我猜这与向所有频道广播的套接字有关,这会导致某种错误,请阅读有关它的内容here

所以我将回调函数的调用改为:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-24
    • 2021-11-06
    • 2016-10-25
    • 2018-02-19
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多