Node.js新手求助:使用mssql实现客户端动作记录插入行功能
嘿,作为Node.js新手能想到把动作记录抽成通用函数,这个思路真的很赞!我来帮你把这个saveActionToDB函数完善起来,顺便把整个MSSQL操作的流程捋清楚,保证稳定好用~
完整实现方案
1. 先搞定MSSQL基础配置
首先确保你已经安装了mssql包,终端里跑这个命令就行:
npm install mssql
然后建议把数据库连接信息抽成单独的配置文件(比如dbConfig.js),这样后续维护起来更方便:
const sql = require('mssql'); // 替换成你自己的数据库信息 const config = { user: '你的数据库用户名', password: '你的数据库密码', server: '数据库服务器地址', // 本地的话填localhost,远程的话填对应IP/域名 database: '你的目标数据库名', options: { encrypt: true, // 如果是Azure SQL必须开,本地开发可以设为false trustServerCertificate: true // 本地开发时忽略证书验证,避免报错 } }; // 用连接池管理数据库连接(比每次新建连接高效太多) const pool = new sql.ConnectionPool(config); const poolConnect = pool.connect(); module.exports = { sql, pool, poolConnect };
2. 完善saveActionToDB核心函数
我把你提到的函数补全,加上连接池使用、错误处理,还有必须的时间戳(记录动作肯定要知道什么时候发生的对吧):
const { sql, pool, poolConnect } = require('./dbConfig'); // 异步函数,接收动作类型和用户名作为参数 async function saveActionToDB(action, username) { try { // 先等连接池初始化完成 await poolConnect; // 创建数据库请求对象 const request = pool.request(); // 用参数化查询传入数据(绝对不能直接拼SQL!防止注入攻击) request.input('action', sql.NVarChar, action); request.input('username', sql.NVarChar, username); request.input('actionTime', sql.DateTime, new Date()); // 自动生成当前时间 // 执行插入语句,这里假设你的记录表名叫ActionLogs,字段是action、username、action_time const result = await request.query(` INSERT INTO ActionLogs (action, username, action_time) VALUES (@action, @username, @actionTime) `); console.log(`动作记录保存成功,影响行数:${result.rowsAffected[0]}`); return true; } catch (err) { console.error('保存动作记录时出错:', err); // 这里可以选择抛出错误让调用方处理,或者返回false,根据你的业务需求来 throw err; } } module.exports = { saveActionToDB };
3. 在functions模块里调用这个函数
举个例子,假设你有个处理用户注册的函数,就可以这样调用saveActionToDB:
const { saveActionToDB } = require('./saveActionToDB'); async function handleUserRegister(username, email) { // 这里写你的注册逻辑,比如插入用户信息到用户表 const registerSuccess = true; // 假设注册成功 if (registerSuccess) { // 记录注册成功的动作 try { await saveActionToDB('用户注册成功', username); return { success: true, message: '注册成功' }; } catch (err) { // 就算记录动作失败,也可以考虑让注册逻辑继续(或者返回错误,看你需求) console.error('记录注册动作失败,但注册流程已完成'); return { success: true, message: '注册成功,但动作记录保存失败' }; } } else { // 记录注册失败的动作 await saveActionToDB('用户注册失败', username).catch(err => console.error(err)); return { success: false, message: '注册失败,请检查输入' }; } } module.exports = { handleUserRegister };
几个关键提醒
- 参数化查询是底线:千万不要直接把用户输入拼进SQL字符串里,不然很容易被SQL注入攻击,用
request.input是最安全的方式。 - 异步操作要处理好:数据库操作都是异步的,一定要用
async/await或者.then()/.catch()来处理,别让异步操作变成回调地狱。 - 连接池一定要用:连接池会自动管理连接的创建和释放,比每次手动创建连接效率高太多,还能避免连接泄漏的问题。
- 错误处理不能少:每个异步操作都要加错误捕获,不然一旦数据库出问题,整个服务可能直接崩溃。
内容的提问来源于stack exchange,提问作者Fede E.
相关产品推荐
相关产品推荐

