Node.js多SQL Server数据库配置连接报错求助
解决方案
错误原因
你当前的login.js尝试动态加载名为dbConfig.${selectedDB}的文件,但实际上所有数据库配置都集中在dbConfig.js一个文件里,并没有对应命名的独立文件,所以Node.js找不到模块,抛出错误。
修复步骤及代码
1. 修正数据库配置引入逻辑
直接引入统一的dbConfig.js文件,从导出的配置对象中根据selectedDB取值,而非动态加载不存在的文件。
2. 增加参数合法性校验
校验传入的selectedDB是否在预定义的配置列表中,避免因非法参数导致连接失败。
3. 修复SQL注入风险
当前用字符串拼接生成SQL语句存在严重的SQL注入漏洞,改用mssql的参数化查询方式。
4. 优化连接资源管理
使用try/finally确保连接无论成功失败都能关闭,避免资源泄漏。
修改后的login.js代码:
const express = require('express'); const sql = require('mssql'); const router = express.Router(); // 直接引入统一的dbConfig配置文件 const dbConfigs = require('./databases/dbConfig'); const dbConnection = (selectedDB) => { // 从配置对象中获取对应数据库的配置 const dbConfig = dbConfigs[selectedDB]; if (!dbConfig) { throw new Error(`Invalid database selection: ${selectedDB}`); } return new sql.ConnectionPool(dbConfig); } router.get('/', async (req, res) => { let connection; try { const selectedDB = req.query.selectedDB; const userName = req.query.userName; const password = req.query.password; // 校验必要参数是否存在 if (!selectedDB || !userName || !password) { return res.status(400).send('Missing required parameters'); } connection = dbConnection(selectedDB); await connection.connect(); // 使用参数化查询避免SQL注入 const result = await connection.request() .input('userName', sql.NVarChar, userName) .input('password', sql.NVarChar, password) .query('SELECT * FROM KULLANICI WHERE KULLANICIADI = @userName AND SIFRE = @password'); const data = JSON.stringify(result.recordset); res.send(data); } catch (err) { console.error(err); res.status(500).send(err.message || 'Server error'); } finally { // 确保连接关闭 if (connection?.close) { await connection.close(); } } }); module.exports = router;
额外说明
- 确认
dbConfig.js的路径正确:如果login.js在routes目录,dbConfig.js在databases目录,./databases/dbConfig这个相对路径是正确的。 - 测试时需确保传入的
selectedDB参数是dbOnlineMesai、dbOnlineBekci或dbOmsGuvenlik中的一个,否则会触发参数错误提示。
内容的提问来源于stack exchange,提问作者ahmetkrakaya
相关产品推荐
相关产品推荐

