在node.js中,如何以最轻量级的方式检查给定的代码字符串在语法上是否正确

In node.js, How do you check whether a given string of code is syntactically correct in the most lightweight way?

本文关键字:字符串 代码 语法 是否 检查 方式 node 轻量级 js      更新时间:2023-09-26

想象一下,我接受了用户的一段代码,只想检查给定的字符串是否是有效的JS?只是从语法角度来看。

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

我不希望使用eval的解决方案,因为当给定的代码"x"语法错误时,整个nodejs进程都会出现语法错误。

要在不执行的情况下检查字符串是否包含语法有效的JavaScript(这将是一个非常糟糕的主意),您不需要库,您可以使用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
}

当然,这可以在服务器端完成。

检查此演示

不要使用eval,这与将服务器的控制权移交给公共互联网完全相同。任何人都可以对你的服务器做任何事情-删除文件、泄露文件、发送垃圾邮件等等。我很震惊,当我注意到这个答案时,它已经获得了3票。

只需使用类似esprima的Javascript解析器http://esprima.org/

下面是一个语法验证器示例,它甚至可以收集多个错误:https://github.com/ariya/esprima/blob/master/demo/validate.js#L21-L41

如果它将在用户的浏览器中运行,那么您可以在那里对它进行评估,而无需往返于服务器。try/catch应该捕捉到错误。直接这样做也会更快地向用户提供反馈。

经过一次实验,我已经有了一些代码。我稍微修改了一下,把它放在一个jsfiddle中。

基本上只使用try/catch:

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

也许你可以试试JSLint。

https://github.com/douglascrockford/JSLint

它有点重,但运行良好。