Stellen Sie sich vor, ich akzeptiere einen Code von einem Benutzer und möchte nur überprüfen, ob die angegebene Zeichenfolge eine gültige JS ist oder nicht. Nur aus der Syntaxperspektive.

function checkCode(x){
// Logic

}
// returns a boolean, whether 'x' is syntactically right or wrong.

Ich möchte keine Lösungen mit eval , da der gesamte NodeJS-Prozess in einen Syntaxfehler gerät, wenn der angegebene Code 'x' syntaktisch falsch ist.

2
Cookies 20 Nov. 2013 im 17:50

4 Antworten

Beste Antwort

Verwenden Sie nicht eval, was buchstäblich der Übergabe der Kontrolle über Ihren Server an das öffentliche Internet entspricht. Jeder kann mit Ihrem Server alles tun - Dateien löschen, Dateien verlieren, Spam-E-Mails senden und so weiter. Ich bin schockiert, dass die Antwort 3 positive Stimmen erhalten hat, als ich sie bemerkte.

Verwenden Sie einfach einen Javascript-Parser wie esprima http://esprima.org/

Hier ist ein Beispiel für einen Syntaxvalidator, mit dem sogar mehrere Fehler erfasst werden können: https://github.com/ariya/esprima/blob/master/demo/validate.js#L21-L41

6
Esailija 20 Nov. 2013 im 21:07

Wenn es im Browser des Benutzers ausgeführt wird, können Sie es dort einfach auswerten, ohne den Server zu durchlaufen. try/catch sollte den Fehler abfangen. Wenn Sie dies direkt tun, erhalten Sie auch schneller eine Rückmeldung an den Benutzer.

Nach einem Experiment lag bereits Code herum. Ich habe es leicht modifiziert und in eine jsfiddle eingefügt.

Verwenden Sie einfach try / catch:

try {
    eval('Invalid source code');
} catch(e) {
    alert('Error: '+e)
}
2
Supr 21 Nov. 2013 im 06:49

Um zu überprüfen, ob eine Zeichenfolge syntaktisch gültiges JavaScript enthält, ohne es auszuführen (was eine unglaublich schlechte Idee wäre), benötigen Sie keine Bibliothek. Sie können den Parser verwenden, den Sie bereits in Ihrer JS-Engine haben:

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

Dies kann natürlich serverseitig erfolgen.

Überprüfen Sie diese Demonstration

9
Denys Séguret 21 Nov. 2013 im 07:56

Vielleicht können Sie JSLint ausprobieren.

https://github.com/douglascrockford/JSLint

Es ist ein bisschen schwer, aber es funktioniert gut.

0
Techniv 20 Nov. 2013 im 14:00