In node.js, How do you check whether a given strin

2019-06-03 10:47发布

问题:

Imagine that I accept a piece of code from a user and want to just check whether the given string is a valid JS or not? Just from the syntax perspective.

function checkCode(x){
// Logic

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

I don't want solutions with eval, since the whole nodejs process gets in to a syntax error when the given code, 'x' is syntactically wrong.

回答1:

Don't use eval that is literally the same as handing over the control of your server to the public internet. Anyone can do anything with your server - delete files, leak files, send spam email and so on. I am shocked that the answer had received 3 upvotes by the time I noticed it.

Just use a Javascript parser like esprima http://esprima.org/

Here is a syntax validator example it can even collect multiple errors: https://github.com/ariya/esprima/blob/master/demo/validate.js#L21-L41



回答2:

To check a string contains syntactically valid JavaScript without executing it (which would be an incredibly bad idea), you don't need a library, you may use the parser you already have in your JS engine :

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

Of course this can be done server side.

Check this demonstration



回答3:

If it's gonna run in the user's browser then you could just eval it there without round-tripping through the server. try/catch should catch the error. Doing it directly will also give feedback to the user quicker.

I already had some code lying around after an experiment. I modified it slightly and put it in a jsfiddle.

Basically just use try/catch:

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


回答4:

Perhaps you can try JSLint.

https://github.com/douglascrockford/JSLint

It's a little bit heavy but it work well.