2017-03-10 3 views
0

Also ich einen Rückruf-Funktion in einem Modul wie folgt exportieren:Socket.io-emit in Rückruf gibt Syntaxerror: Unerwartetes Ende des JSON Eingang

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

Und das Callback funktioniert völlig in Ordnung, wenn ich indem es in meiner GET-Anfrage mit Express.js:

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

    GithubApi(url, (data) => { 

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

Aber wenn ich einen Socket-emit, die Callback-Funktion gibt 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); 
    }); 
}); 
hinzufügen

Kann nicht verstehen, warum der Socket die Anfrage stören und einen Fehler mit JSON zurückgeben würde. Kann jemand helfen?

+0

Ihre JSON überprüfen, es ist schlecht. – Darkrum

Antwort

1

Das Wahrscheinlichste muss durch die Tatsache verursacht werden, dass body.body keine gültige JSON-Zeichenfolge enthält.

Wenn Sie Code wie folgt aus:

JSON.parse(body.body) 

sollten Sie immer verwenden try/catch weil JSON.parse Ausnahmen auf schlechten JSON wirft.

Sehen Sie diese Antworten für weitere Informationen:

+0

Ja, ich kann das sehen, aber warum sollte der "body.body" kein gültiges JSON enthalten, nur weil ich vorher einen Socket laufen lasse? Verstehe nicht warum und wie das stören würde. – Jesper

+0

Es ist ein gültiger JSON, wenn ich nicht den Socket-emit in der Callback-Funktion bei app.get ("/") ... habe, aber wenn ich den Socket-emit hinzufüge, wird der body.body gültiger JSON. – Jesper

+0

@Jesper "Warum sollte der" body.body "keinen gültigen JSON enthalten" - Ich weiß nicht warum, ich sage nur, dass JSON manchmal ungültig ist - was offensichtlich hier der Fall ist - und deshalb musst du es versuchen /Fang. Hast du überhaupt getestet, was body.body eigentlich enthält? Wenn Sie sehen, was da ist, haben Sie vielleicht einen Hinweis ** warum ** es ist kein gültiger JSON. – rsp

0

So war das Problem mit dem io.sockets.emit("update", {message: data});. Aus irgendeinem Grund störte das die Anfrage (weiß immer noch nicht warum zäh). Ich denke, es hat etwas mit dem Socket Broadcasting zu allen Kanälen zu tun, und das verursacht eine Art von Fehler, lesen Sie etwas darüber here.

Also änderte ich den Anruf an die Callback-Funktion dazu:

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

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