En node.js, ¿Cómo verifica si una cadena de código dada es sintácticamente correcta de la manera más liviana?

¿Imagina que acepto un fragmento de código de un usuario y solo quiero comprobar si la cadena dada es una JS válida o no? Solo desde la perspectiva de la syntax.

function checkCode(x){ // Logic } // returns a boolean, whether 'x' is syntactically right or wrong. 

No quiero soluciones con eval , ya que todo el proceso de nodejs genera un error de syntax cuando el código dado, ‘x’, es sintácticamente incorrecto.

No use eval que es literalmente lo mismo que transferir el control de su servidor a la Internet pública. Cualquiera puede hacer cualquier cosa con su servidor: eliminar archivos, filtrar archivos, enviar correos electrónicos no deseados, etc. Estoy sorprendido de que la respuesta haya recibido 3 votos en el momento en que me di cuenta.

Simplemente use un analizador de Javascript como esprima http://esprima.org/

Aquí hay un ejemplo de validador de syntax que incluso puede recostackr varios errores: https://github.com/ariya/esprima/blob/master/demo/validate.js#L21-L41

Para comprobar si una cadena contiene JavaScript sintácticamente válido sin ejecutarlo (lo que sería una idea increíblemente mala), no necesita una biblioteca, puede usar el analizador que ya tiene en su motor JS:

 try { new Function(yourString); // yourString contains syntactically correct JavaScript } catch(syntaxError) { // There's an error, you can even display the error to the user } 

Por supuesto esto se puede hacer del lado del servidor.

Mira esta demostración

Si se va a ejecutar en el navegador del usuario, entonces podría evaluarla allí sin tener que pasar por el servidor. try/catch debería atrapar el error. Hacerlo directamente también le dará retroalimentación al usuario más rápido.

Ya tenía un código por ahí después de un experimento. Lo modifiqué ligeramente y lo puse en un jsfiddle .

Básicamente solo usa try / catch:

 try { eval('Invalid source code'); } catch(e) { alert('Error: '+e) } 

Quizás puedas probar JSLint.

https://github.com/douglascrockford/JSLint

Es un poco pesado pero funciona bien.

    Intereting Posts