2017-04-11 6 views
0

Ich habe zwei URLs, die eine .json.gz Datei -Express.js - Verwenden Sie verschachtelte Anforderung JSON erhalten von Backup-URL

var url = "http://post.s3post.cf/s3posts.json.gz"; 
var backupURL = "https://s3-us-west-2.amazonaws.com/s3post.cf/s3posts.json.gz"; 

Ich bin in der Lage erfolgreich die Anforderungsmodul verwendenjson von der bekommen Datei -

app.all('*', function(req, res, next) { 
    request({ 
     method: 'GET', 
     uri: url, 
     gzip: true 
    }, function(error, response, body) { 
     res.locals.posts = JSON.parse(body); 
     next(); 
    }); 
}); 

Was ich will, ist zu tun, wenn die Anforderung mit url ausfällt, möchte ich die backupURL verwenden, um die json von zu bekommen. So logisch, dachte ich, wenn ich einen Fehler empfangen, ich hat einen verschachtelten Wunsch, dies zu tun verwenden würde -

app.all('*', function(req, res, next) { 
    request({ 
     method: 'GET', 
     uri: url, 
     gzip: true 
    }, function(error, response, body) { 
     if(error) { 
      request({ 
       method: 'GET', 
       uri: backupURL, 
       gzip: true 
      }, function(error, response, body) { 
       res.locals.posts = JSON.parse(body); 
       next(); 
      }); 
     } else { 
      res.locals.posts = JSON.parse(body); 
      next(); 
     } 
    }); 
}); 

Dies funktioniert nicht. Beide URLs arbeiten einzeln mit einer Anfrage. Was kann ich tun, um backupURL zu verwenden, wenn die Anfrage mit url fehlschlägt?

EDIT 1-

Das Programm kompiliert und beginnt zu meiner app zu hören. Es ist, wenn ich eine Seite anfordern, die es mit diesem Fehler abstürzt -

undefined:1 
<?xml version="1.0" encoding="UTF-8"?> 
^ 

SyntaxError: Unexpected token < in JSON at position 0 
    at JSON.parse (<anonymous>) 
    at Request._callback (/Users/Anish/Workspace/NodeJS/unzipper/app.js:65:28) 
    at Request.self.callback (/Users/Anish/Workspace/NodeJS/unzipper/node_modules/request/request.js:188:22) 
    at emitTwo (events.js:106:13) 
    at Request.emit (events.js:194:7) 
    at Request.<anonymous> (/Users/Anish/Workspace/NodeJS/unzipper/node_modules/request/request.js:1171:10) 
    at emitOne (events.js:96:13) 
    at Request.emit (events.js:191:7) 
    at IncomingMessage.<anonymous> (/Users/Anish/Workspace/NodeJS/unzipper/node_modules/request/request.js:1091:12) 
    at Object.onceWrapper (events.js:293:19) 
+1

‚Problem‘ ist kein Problem Beschreibung. Es gibt Konsequenzen, genau diese. Nämlich jeder Fehler, der angezeigt wird. Sie können auch ein arum-mans-debugging verwenden und console.log-Anweisungen hinzufügen, um genau zu sehen, welchen Pfad der Code einnimmt und was der Inhalt von Variablen zu diesem Zeitpunkt ist. – Gimby

+0

@ Gimby Ich habe meine Frage mit der Fehlerinformation bearbeitet. –

Antwort

1

Versuch Response.Status zu verwenden, wenn sein 200 dann weiter sonst bewegen, wenn seine 400 oder 500 dann Backup-URL verwenden

+0

mit '200' Status, können Sie auch' HTML' erhalten, die Fehler beim Parsen erzeugt – abdulbarik

+0

@Vipul Das hat funktioniert. Ich musste nur "if (error)" in "if (error || response.status! = 200)" ändern. –

1

Es ist Parsing-Fehler.

< es scheint, wie Sie HTML Daten erhalten und an erster Stelle, Sie werden immer Fehler bei der Analyse

immer Ihren Körper überprüfen, bevor analysiert

if(typeof body==='string'){ 
    body = JSON.parse(body); 
} 
res.locals.posts = body; 
Verwandte Themen