执行Node.js插入代码后SQL表仅显示空值行的原因排查
用户注册插入数据全为NULL问题排查
问题代码
const db = require('./db'); const { createHash } = require('crypto'); async function registerUser(user, pass, email) { if (pass.includes('?') || pass.includes('\'') || pass.includes('"')) { return false; } const salt = makeSalt(16); console.log("salt: " + salt); var hash = salt.concat(pass); console.log("salt and pass: " + hash); hash = createHash('sha256').update(hash).digest('hex'); console.log(hash); try { await db.query('INSERT INTO users (`user`, salt, hash, email) VALUES (?,?,?,?)', [user, salt, hash, email]); console.log("User registered successfully"); } catch (error) { console.error("Error registering user:", error); } } function makeSalt(length) { let result = ''; const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@!#$_&'; const charactersLength = characters.length; let counter = 0; while (counter < length) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); counter += 1; } return result; } // Example usage registerUser("test", "spacefort66", "example@gmail.com");
问题描述
已将数据库users表所有列设置为VARCHAR类型,执行上述代码后,表中仅插入一行各列均为NULL的记录,预期应插入包含用户名、salt、hash及邮箱的有效数据。
截图信息
- 数据库表结构:
users表包含user、salt、hash、email四个VARCHAR类型列 - 查询结果:表中存在一行所有字段均为NULL的记录
问题原因及解决方法
1. 关键字冲突(核心原因)
user是SQL的保留关键字,直接在INSERT语句中使用未加反引号包裹的user列名,会导致数据库无法正确解析列名,参数绑定失败,最终插入NULL值。
解决: 修改INSERT语句,将user列用反引号包裹:
await db.query('INSERT INTO users (`user`, salt, hash, email) VALUES (?,?,?,?)', [user, salt, hash, email]);
2. 数据库驱动的Promise支持检查
如果使用的是原生mysql模块,其query方法默认是回调式,未经过util.promisify转换的话,await无法正确等待查询完成,可能导致执行顺序异常。
解决: 在db.js中对query方法进行Promise化:
const mysql = require('mysql'); const util = require('util'); const connection = mysql.createConnection({ host: '你的数据库地址', user: '用户名', password: '密码', database: '数据库名' }); // 转换query方法为Promise支持 connection.query = util.promisify(connection.query); module.exports = connection;
3. 密码校验逻辑修正
原代码中pass.includes('\"')是错误的转义,应改为pass.includes('"'),否则会导致包含双引号的密码被错误拦截(不影响插入NULL问题,但需修正以保证逻辑正确)。
内容的提问来源于stack exchange,提问作者Isaac Copenhaver
相关产品推荐
相关产品推荐

