Ответ 1
Лучший способ уловить неверные ошибки разбора JSON - это перевести вызовы на JSON.parse()
в блок try/catch
.
У вас действительно нет другого варианта - встроенная реализация генерирует исключение из недопустимых данных JSON, и единственный способ предотвратить это исключение от остановки приложения - это поймать его. Даже использование сторонней библиотеки не позволит избежать этого - они должны сделать try/catch
при вызове JSON.parse()
где-нибудь.
Единственная альтернатива - реализовать собственный алгоритм синтаксического анализа JSON, который может быть более прощающим в отношении недействительных структур данных, но это похоже на то, чтобы выкапывать отверстие в 1 кубический метр с небольшим ядерным оружием.
Примечание о производительности
JavaScript-движок v8, используемый Node.js не может оптимизировать функции, содержащие блок try/catch
.
Обновление: v8 4.5 и выше может оптимизировать try/catch. Для более старых версий см. Ниже.
Простым обходным решением является включение логики безопасного анализа в отдельную функцию, чтобы можно было оптимизировать основную функцию:
function safelyParseJSON (json) {
// This function cannot be optimised, it best to
// keep it small!
var parsed
try {
parsed = JSON.parse(json)
} catch (e) {
// Oh well, but whatever...
}
return parsed // Could be undefined!
}
function doAlotOfStuff () {
// ... stuff stuff stuff
var json = safelyParseJSON(data)
// Tadaa, I just got rid of an optimisation killer!
}
Если разбор JSON выполняется спорадически, это может не иметь заметного влияния на производительность, но если его использовать ненадлежащим образом в функции интенсивного использования, это может привести к резкому увеличению времени отклика.
Примечание о блокировке try/catch
Следует отметить, что every.single.statement кода JavaScript в Node.js выполняется только один раз, независимо от того, вызвал ли он основную функцию или от обратного вызова или от другого модуля или чего-то еще. Таким образом, каждый оператор блокирует процесс. Это не обязательно плохо - хорошо спроектированное приложение будет тратить большую часть своего времени на ожидание внешнего ресурса (ответ базы данных, HTTP-связь, операции с файловой системой и т.д.). Поэтому очень важно, что часто исполняемый код JavaScript может быть оптимизирован движком v8, поэтому в этом заблокированном состоянии требуется как можно меньше времени - см. Примечание о производительности.