2017-04-11 5 views
0

J'ai deux URL qui ont un fichier .json.gz -express.js - Utiliser demande imbriquée pour obtenir JSON URL sauvegarde

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

Je suis en mesure d'utiliser avec succès le module de demande pour obtenir json de la fichier -

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

Ce que je veux faire est, si la demande avec url échoue, je veux utiliser le backupURL pour obtenir le json de. Donc, logiquement, je pensais que si je recevais une erreur, j'utiliser une requête imbriquée pour ce faire -

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

Ce ne fonctionne pas. Individuellement, les deux URL fonctionnent avec une requête. Que puis-je faire pour utiliser backupURL lorsque la demande avec url échoue?

EDIT 1-

Le programme compile et commence à écouter mon application. Il est quand je demande une page qui se bloque avec cette erreur -

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

« ne fonctionne pas » est pas une description du problème. Il y a des conséquences, détaillez-les. A savoir toute erreur qui est affichée. Vous pouvez également utiliser des instructions de débogage médiocres et ajouter des instructions console.log pour voir exactement quel chemin prend le code et quel est le contenu des variables à ce stade. – Gimby

+0

@Gimby J'ai modifié ma question avec les informations d'erreur. –

Répondre

1

essayer d'utiliser Response.Status si son est 200 puis passer plus autre si son 400 ou 500 puis utilisez URL sauvegarde

+0

avec l'état '200', vous pouvez également obtenir' HTML' qui produit une erreur lors de l'analyse – abdulbarik

+0

@Vipul Cela a fonctionné. Je devais juste changer 'if (error)' en 'if (error || response.status! = 200)'. –

1

C'est une erreur d'analyse.

< il semble que vous obtenez HTML données et à la première position que vous obtenez l'analyse syntaxique erreur

Vérifiez toujours votre corps avant d'analyser

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