Usando node/express: quiero obtener algo de JSON de los encabezados de solicitud, pero quiero hacerlo de manera segura.
Si por alguna razón no es JSON válido, está bien, puede devolver falso o lo que sea y simplemente rechazará la solicitud y continuará. El problema es que arroja un error de sintaxis si no es un JSON válido. Normalmente quiero que explote un error de sintaxis, pero no en este caso.
var boom = JSON.parse(req.headers.myHeader);
¿Raspo la pila y compruebo si hay una mala llamada de análisis de ese módulo en particular, y si es el caso, la ignora? Eso parece un poco loco. Seguramente hay una mejor manera.
EDITAR: Soy consciente de que los bloques try/catch son una forma de manejar este error, pero ¿es la mejor manera en una aplicación de nodo? ¿Esta manera bloqueará el nodo?
La mejor manera de detectar errores de análisis de JSON no válidos es colocar las llamadas a JSON.parse() en un bloque de try/catch .
Realmente no tiene ninguna otra opción: la implementación integrada genera una excepción en los datos JSON no válidos y la única forma de evitar que esa excepción detenga su aplicación es atraparla. Incluso el uso de una biblioteca de terceros no evitará eso: deben try/catch una llamada JSON.parse() en alguna parte.
La única alternativa es implementar su propio algoritmo de análisis JSON que podría ser más indulgente con las estructuras de datos no válidas, pero que se siente como cavar un agujero de 1 metro cúbico con una pequeña bomba nuclear.
El motor JavaScript v8 utilizado por Node.js no puede optimizar las funciones que contienen un bloque try/catch .
Actualización: v8 4.5 y superior pueden optimizar try/catch . Para versiones anteriores, consulte a continuación.
Una solución simple es colocar la lógica de análisis seguro en una función separada para que la función principal aún pueda optimizarse:
function safelyParseJSON (json) { // This function cannot be optimised, it's 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! }Si el análisis de JSON se realiza esporádicamente, es posible que esto no tenga un efecto notable en el rendimiento, pero si se usa incorrectamente en una función de uso intensivo, podría generar un aumento drástico en los tiempos de respuesta.
Cabe señalar que cada declaración única del código JavaScript en Node.js se ejecuta solo una a la vez, sin importar si se llama desde la función principal o desde una devolución de llamada o desde un módulo diferente o lo que sea. Como tal, cada declaración bloqueará el proceso. Esto no es necesariamente algo malo: una aplicación bien diseñada pasará la mayor parte de su tiempo esperando un recurso externo (respuesta de la base de datos, comunicación HTTP, operaciones del sistema de archivos, etc.). Por lo tanto, es de gran importancia que el motor v8 pueda optimizar el código JavaScript que se ejecuta con frecuencia para que tarde el menor tiempo posible en este estado bloqueado; consulte la nota sobre el rendimiento.
Puedes usar try y catch
function parseMyHeader(){ try { return JSON.parse(req.headers.myHeader); } catch(ex){ return null; } }Try/catch estándar es la forma correcta de manejar un error JSON.parse en node.js, como se menciona en las prácticas de producción de nodos para documentos de manejo de errores del sitio web de joyent, que dice:
... el único caso de uso común en el que usaría try/catch es JSON.parse y otras funciones de validación de entrada del usuario.
Lo cual también está de acuerdo con el enlace a nodejitsu que Aleksandr proporcionó en su comentario.