2017-09-22 3 views
1

Ich habe ein Problem beim Befolgen eines Tutorials zum Thema HTTP Anfragen. Ich kann den Code nicht zur automatischen Analyse meiner Antwort an JSON bekommen. Dies bleibt Text. Während angegeben wird, dass bei der Angabe von 'json: true' der Typ auf json gesetzt und analysiert wird.JavaScript Request Response Type

Tutorial: https://www.terlici.com/2015/04/28/couchdb-node-express.html

var request = require('request'); 

var url = 'http://127.0.0.1:5984/'; 
var db = 'js-express-librarytutorial/'; 
var id = 'document_id'; 

request.put(url + db); 

request.put({ 
    url: url + db + id, 
    body: { 
     user: "Tom", 
     message: "Document 2" 
    }, 
    json: true 
}, function(){request(url + db + id, function(err, res, body) { 
     console.log(typeof (body)); 
     console.log(body); 
     console.log(body.user + ' : ' + body.message); 
    }) 
}); 

Wer weiß, wie die automatische Analyse von http-calls auszulösen.

+0

was die console.log tut (Körper) zeigt an? –

+0

Typeof (Körper) gibt den Typ String zurück. Der Körper selbst ist eine Zeichenkette des jsons, die an die db gesendet wird. Die Idee ist, dass ich JSON von der DB zurückbekomme, da JSON ausgeht und es auf der Couch als JSON gespeichert wird. Es gibt keine Logik dafür, dass es eine Zeichenfolge bei der Rückkehr ist. – TomBr

+0

Ja, es ist ein bisschen bizarr! und wenn Sie console.log (JSON.parse (body)) tut es zeigt dann ein JSON? –

Antwort

0

So ergab Forschung, dass mein Problem wegen Scoping und Verschachtelung von Callback-Funktionen in meinem ursprünglichen Anruf war.

Das Argument json: true im Anforderungsaufruf legt den Inhaltstyp auf application/json fest. Diese nutzt automatisch die Analyse aller zurückgegebenen Daten:

request({url: url+db+"1", method: 'get', json: true}, function(err, res, body) { 
    if (err) { 
     throw err; 
    } 
    console.log(typeof (body)); 
    console.log(body); 
}); 

In diesem Beispiel kein Parsing erforderlich ist, und wird ein Objekt zurückgegeben.

Allerdings, wenn ich Nest der Rückruf in einer anonymen Funktion mit einem separaten Anforderungsruf des Content-Type auf Text kehre zurück/*

Mit anonymem Rückruf:

request.put(url + db, function(err, res, body){ 
    request.put({ 
     url: url + db + id, 
     body: { user : "Tom", message: "Document"}, 
     json: true 
    },function(){ 
     request(url+db+id,, function(err, res, body){ 
      console.log(typeof (body)); 
      console.log(body); 
     }); 
    }); 
}); 

Dies kann verhindert werden durch:

  • Angabe des Inhaltstyp in separaten Anforderungsruf
Beispiel

:

request.get({...}, function(){request({url: url+db+id, method: "GET", json: true}, function(err, res, body){})} 
  • die seperate Anforderungsruf entfernen und die Rückgabedaten in den Rückruf direkt verarbeiten:

Beispiel:

request({url: url+db+"1", method: 'get', json: true}, function(err, res, body) {...}); 
1

Versuchen Sie, die in request json wie das Senden:

request.put({ 
    url: url + db + id, 
    json: ' { "user": "Tom", "message": "Document 2" }' 
}, function(){request(url + db + id, function(err, res, body) { 
     console.log(typeof (body)); 
     console.log(body); 
     console.log(body.user + ' : ' + body.message); 
    }) 
}); 

Das gerade arbeiten. Ich habe noch keine Rechte, um Fragen zu kommentieren. Sonst hätte ich einen Kommentar abgeben sollen. Daher, als Antwort zu posten. Bitte lassen Sie mich wissen, wenn es für Sie funktioniert.

Verwandte Themen