如何在Node.js(Express)异步API中实现SQL Server用户预插入验证
在SQL Server插入用户前验证是否存在的两种实现方式
方式一:先查询再插入(直观易读)
先检查数据库中是否存在相同用户名或邮箱的用户,确认不存在后再执行插入:
async function addUser(user) { try { let pool = await sql.connect(config); // 这里以email作为唯一标识,可根据需求换成userName let checkUser = await pool.request() .input('email', sql.NVarChar, user.email) .query(`SELECT COUNT(*) AS count FROM testRegistration01 WHERE email = @email`); const userExists = checkUser.recordset[0].count > 0; if (userExists) { console.log({ message: "该用户已存在" }); return; } // 不存在则执行插入操作 let addUserResult = await pool.request() .input('userName', sql.NVarChar, user.userName) .input('email', sql.NVarChar, user.email) .input('password', sql.NVarChar, user.password) .query(`INSERT INTO testRegistration01 (userName, password, email) VALUES(@userName, @password, @email)`); console.log(addUserResult.recordsets, { message: "记录插入成功" }); } catch (err) { console.log(err); } }
方式二:用SQL语句一次性完成检查与插入(更高效)
通过INSERT ... WHERE NOT EXISTS语句,在单次数据库请求中完成验证和插入,减少网络交互次数:
async function addUser(user) { try { let pool = await sql.connect(config); let addUserResult = await pool.request() .input('userName', sql.NVarChar, user.userName) .input('email', sql.NVarChar, user.email) .input('password', sql.NVarChar, user.password) .query(`INSERT INTO testRegistration01 (userName, password, email) SELECT @userName, @password, @email WHERE NOT EXISTS ( SELECT 1 FROM testRegistration01 WHERE email = @email )`); // 根据受影响行数判断是否插入成功 if (addUserResult.rowsAffected[0] === 0) { console.log({ message: "该用户已存在" }); } else { console.log(addUserResult.recordsets, { message: "记录插入成功" }); } } catch (err) { console.log(err); } }
额外建议:数据库层面添加唯一约束
为了从根源避免重复数据,建议在表的唯一标识字段(如email或userName)上添加唯一约束:
-- 给email字段添加唯一约束 ALTER TABLE testRegistration01 ADD CONSTRAINT UQ_testRegistration01_Email UNIQUE (email); -- 或者给userName字段添加 ALTER TABLE testRegistration01 ADD CONSTRAINT UQ_testRegistration01_UserName UNIQUE (userName);
添加约束后,若插入重复数据SQL Server会抛出错误,可在代码的catch块中针对性处理:
catch (err) { // 2601是SQL Server唯一约束冲突的错误码 if (err.number === 2601) { console.log({ message: "该用户已存在" }); } else { console.log(err); } }
内容的提问来源于stack exchange,提问作者Muhammad Osama
相关产品推荐
相关产品推荐

