Проблеми з іншими відповідями:
- небезпечний
JSON.parse
- відсутність перевірки коду відповіді
Всі відповіді тут використовують JSON.parse()в небезпечним способом . Ви завжди повинні поміщати всі дзвінки JSON.parse()в try/catchблок, особливо , коли ви розбираєте JSON , що виходить від зовнішнього джерела, як ви робите тут.
Ви можете використовувати requestдля автоматичного синтаксичного аналізу JSON, про що тут не згадувалося в інших відповідях. Відповідь вже використовується за допомогою requestмодуля, але він використовує JSON.parse()для синтаксичного аналізу JSON вручну - який завжди повинен запускатися всередині try {} catch {}блоку для обробки помилок неправильного JSON, інакше вся програма вийде з ладу. І трапляється неправильний JSON, повірте мені.
Інші відповіді, які httpтакож використовуються, використовуються JSON.parse()без перевірки на винятки, які можуть трапитись і призвести до збоїв у роботі програми.
Нижче я покажу кілька способів безпечного впорання з цим.
У всіх прикладах використовується загальнодоступний GitHub API, тому кожен може спробувати цей код безпечно.
Приклад з request
Ось робочий приклад, requestякий автоматично аналізує JSON:
'use strict';
var request = require('request');
var url = 'https://api.github.com/users/rsp';
request.get({
url: url,
json: true,
headers: {'User-Agent': 'request'}
}, (err, res, data) => {
if (err) {
console.log('Error:', err);
} else if (res.statusCode !== 200) {
console.log('Status:', res.statusCode);
} else {
console.log(data.html_url);
}
});
Приклад з httpіtry/catch
Це використовує https- просто змініть httpsна, httpякщо ви хочете з'єднання HTTP:
'use strict';
var https = require('https');
var options = {
host: 'api.github.com',
path: '/users/rsp',
headers: {'User-Agent': 'request'}
};
https.get(options, function (res) {
var json = '';
res.on('data', function (chunk) {
json += chunk;
});
res.on('end', function () {
if (res.statusCode === 200) {
try {
var data = JSON.parse(json);
console.log(data.html_url);
} catch (e) {
console.log('Error parsing JSON!');
}
} else {
console.log('Status:', res.statusCode);
}
});
}).on('error', function (err) {
console.log('Error:', err);
});
Приклад з httpіtryjson
Цей приклад схожий на наведений вище, але використовує tryjsonмодуль. (Застереження: я є автором цього модуля.)
'use strict';
var https = require('https');
var tryjson = require('tryjson');
var options = {
host: 'api.github.com',
path: '/users/rsp',
headers: {'User-Agent': 'request'}
};
https.get(options, function (res) {
var json = '';
res.on('data', function (chunk) {
json += chunk;
});
res.on('end', function () {
if (res.statusCode === 200) {
var data = tryjson.parse(json);
console.log(data ? data.html_url : 'Error parsing JSON!');
} else {
console.log('Status:', res.statusCode);
}
});
}).on('error', function (err) {
console.log('Error:', err);
});
Резюме
Приклад, який використовує, requestє найпростішим. Але якщо з якихось причин ви не хочете його використовувати, то не забудьте завжди перевіряти код відповіді та безпечно аналізувати JSON.