Node.js通过exports封装数据库查询方法时报SQL语法错误
报错原因
你遇到的无效或意外的标记报错,本质是代码中混入了中文全角弯引号,不符合JS和SQL对语法符号的要求:
- 这类问题一般是输入法开启了「智能标点自动替换」功能导致的:写代码时输入的半角引号被自动转成了全角弯引号,也就是代码里看到的
‘DARK’这类带弧度的引号 - 当包裹整个SQL字符串的边界引号被替换成全角时,JS解析器识别不到字符串的起止边界,会把SQL里的语法片段当成JS代码解析,直接抛出无效标记的语法错误
- 就算外层包裹SQL的引号是正常半角的,内部全角引号拼出的SQL传给数据库后,也会被数据库识别为无效语法
修复方法
- 逐字符检查相关代码的引号,把所有全角弯引号替换为英文半角直引号,正确的实现代码如下:
// q.js 原有封装逻辑保持不变即可 var string = "SELECT * FROM COLORS WHERE SHADE = 'DARK';"; var q = require('./q'); q.query(string, function(err, result) { console.log(result) }); - 写代码阶段暂时关闭输入法的智能标点、自动替换弯引号功能,从根源上避免这类语法错误
- 写代码时可以借助编辑器的语法高亮排查问题:正常被引号包裹的字符串会有统一的高亮配色,如果出现颜色断档、SQL片段被识别成JS关键字/变量,大概率就是引号边界写错了
优化提示
- 不要直接拼接SQL字符串传值,容易引发SQL注入风险,可以用数据库驱动自带的占位符传参,由驱动自动完成值的转义、引号包裹,比如常见MySQL驱动的实现:
// 定义SQL时用?做占位符,不要直接拼接查询值 var string = "SELECT * FROM COLORS WHERE SHADE = ?"; // 传参时把实际查询值作为数组传入query方法 q.query(string, ['DARK'], function(err, result) { console.log(result) });
内容的提问来源于stack exchange,提问作者codingPerson321
相关产品推荐
相关产品推荐

