You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行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('\&quot;')是错误的转义,应改为pass.includes('"'),否则会导致包含双引号的密码被错误拦截(不影响插入NULL问题,但需修正以保证逻辑正确)。

内容的提问来源于stack exchange,提问作者Isaac Copenhaver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:08:19