Express.js - используйте вложенный запрос для получения JSON из резервной копии URL
У меня есть два URL, которые имеют .json.gz
файл -
var url = "http://post.s3post.cf/s3posts.json.gz";
var backupURL = "https://s3-us-west-2.amazonaws.com/s3post.cf/s3posts.json.gz";
Я могу успешно использовать модуль запроса, чтобы получить json
из файла -
app.all('*', function(req, res, next) {
request({
method: 'GET',
uri: url,
gzip: true
}, function(error, response, body) {
res.locals.posts = JSON.parse(body);
next();
});
});
Что я хочу сделать, если запрос с url
не удается, я хочу использовать backupURL
чтобы получить json
от. Логично, я подумал, что если я получу ошибку, я буду использовать вложенный запрос для этого -
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();
}
});
});
Это не работает. По отдельности оба URL работают с одним запросом. Что я могу сделать, чтобы использовать backupURL
когда запрос с url
потерпит неудачу?
РЕДАКТИРОВАТЬ 1 -
Программа компилируется и начинает слушать мое приложение. Когда я запрашиваю страницу, она падает с этой ошибкой -
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)
2 ответа
Попробуйте использовать response.status, если его значение равно 200, а затем перейти еще дальше, если его 400 или 500, а затем использовать резервный URL
Это ошибка разбора.
<
кажется, что вы получаете HTML
данные и в первой позиции вы получаете ошибку разбора
Всегда проверяйте свое тело перед разбором
if(typeof body==='string'){
body = JSON.parse(body);
}
res.locals.posts = body;