Node.js中query函数定义双参数但调用仅传一个的原因求解
解答:为什么
query函数传一个参数也能正常工作? Great question! Let's break this down clearly:
1. JavaScript函数参数的可选性
首先,在JavaScript中,函数定义的参数并不强制要求调用时必须全部传入。如果某个参数没有被传递,它会默认取undefined值。
看你的query函数定义:
let query = function( sql, values ) { // ...函数逻辑 }
这里的values是可选参数——当你调用query(_sql)时,values会被自动设为undefined,这完全符合JavaScript的语法规则。
2. MySQL连接池的query方法特性
再看query函数内部调用的connection.query(sql, values, ...):MySQL官方的Node.js驱动中,query方法的第二个参数(也就是这里的values)本身就是可选的。它的作用是替换SQL语句中的占位符(比如?),如果你的SQL语句里没有需要替换的占位符,完全可以省略这个参数。
在你的postdetail函数里,SQL是直接用模板字符串把id拼进去的:
let _sql = ` SELECT * FROM posts where postid = ${id} `
这里没有使用占位符,所以不需要传递values参数,只传_sql就足够了。
3. 重要安全提醒
不过要注意:这种直接用模板字符串拼接SQL的写法存在严重的SQL注入风险!比如如果有人传入恶意的id值(比如1; DROP TABLE posts;),会直接执行破坏数据库的操作。
建议改成更安全的参数化查询写法:
let postdetail = function (id) { let _sql = `SELECT * FROM posts where postid = ?` return query(_sql, [id]) }
这时values参数(这里是[id])会被MySQL驱动自动转义,彻底避免SQL注入问题。
内容的提问来源于stack exchange,提问作者yupang
相关产品推荐
相关产品推荐

