在node.js中,如何以最轻量级的方式检查给定的代码字符串在语法上是否正确
In node.js, How do you check whether a given string of code is syntactically correct in the most lightweight way?
想象一下,我接受了用户的一段代码,只想检查给定的字符串是否是有效的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
它有点重,但运行良好。
相关文章:
- jsf中两个字符串的颜色代码差异
- 如何在html中将字符串转换为数字?以及如何将变量传递到scriptlet代码中
- 为什么Javascript程序员更喜欢在代码中重复字符串作为常量,而不是使用枚举类型的对象
- Vim-当代码的文字字符串中有括号时,如何实现正确的缩进
- 空引用错误 Eval(字符串) 将其传递给代码隐藏中的函数
- 如何优化要在 javascript 字符串中使用的长 html 代码的创建
- 将字符串作为一段 HTML/javascript 代码执行
- 如何使用预定义字符串列表“动态”生成 HTML 代码
- Javascript方法以字符串形式返回方法代码
- Javascript对象字符串值-在应该隐藏的时候呈现的HTML代码
- 将JSON字符串解析为HTML5代码的更快方法
- eval和setTimeout之间的差异执行字符串代码
- 若字符串为null,则通过启发式方法无法访问代码,将null赋值给变量
- 如何从视频标记错误事件中获取字符串/消息或代码
- 在实现基本Sharethis代码时指定了无效或非法的字符串
- 编写一个代码来拆分字符串“test”,并将Name的值分配给文本框,将ok的值分配到复选框
- Razor代码在JavaScript字符串中创建新行
- 如何应用youtube嵌入代码(如果字符串是youtube url)
- Node.js字符串中的10位哈希代码
- 从HTML字符串代码中获取dom而不执行它