web连接sqlsever实现增删改查
作者:休闲 来源:时尚 浏览: 【大 中 小】 发布时间:2026-10-17 06:18:52 评论数:
直接上代码。实删改假设你已经装好了SQL Server,现增也配好了数据库,实删改下面这套流程能让你用Node.js在十分钟内跑通增删改查。现增我拿一个用户表举例,实删改字段就三个:id(自增主键)、现增name、实删改email。现增别搞太复杂,实删改先把链路走通再说。现增
先建项目,实删改初始化,现增装两个包:express和mssql。实删改mssql是现增微软官方维护的Node.js驱动,比用ODBC那种老路子省心得多。实删改
npm init -y npm install express mssql 数据库连接配置单独放一个文件,叫db.js。这里有个坑:SQL Server默认端口1433,但如果你用的是Express版,实例名可能是SQLEXPRESS,端口会变成动态的。最稳的方式是开TCP/IP协议,在SQL Server配置管理器里把端口固定成1433,然后重启服务。
// db.js const sql = require('mssql'); const config = { user: 'sa', password: '你的密码', server: 'localhost', port: 1433, database: 'TestDB', options: { encrypt: false, trustServerCertificate: true } }; const poolPromise = new sql.ConnectionPool(config) .connect() .then(pool => { console.log('数据库连接成功'); return pool; }) .catch(err => console.error('连接失败:', err)); module.exports = { sql, poolPromise }; 注意encrypt和trustServerCertificate这两个参数。本地开发不设它们,连接会直接报SSL错误。我当初在这卡了半小时,查日志才发现是驱动默认要加密。
接下来写路由。增删改查各一个接口,用Express的Router挂上去。
// routes.js const express = require('express'); const router = express.Router(); const { sql, poolPromise } = require('./db'); // 查:获取所有用户 router.get('/users', async (req, res) => { const pool = await poolPromise; const result = await pool.request().query('SELECT * FROM Users'); res.json(result.recordset); }); // 增:添加用户 router.post('/users', async (req, res) => { const { name, email } = req.body; const pool = await poolPromise; await pool.request() .input('name', sql.NVarChar, name) .input('email', sql.NVarChar, email) .query('INSERT INTO Users (name, email) VALUES (@name, @email)'); res.send('添加成功'); }); // 改:更新用户 router.put('/users/:id', async (req, res) => { const { id } = req.params; const { name, email } = req.body; const pool = await poolPromise; await pool.request() .input('id', sql.Int, id) .input('name', sql.NVarChar, name) .input('email', sql.NVarChar, email) .query('UPDATE Users SET name=@name, email=@email WHERE id=@id'); res.send('更新成功'); }); // 删:删除用户 router.delete('/users/:id', async (req, res) => { const { id } = req.params; const pool = await poolPromise; await pool.request() .input('id', sql.Int, id) .query('DELETE FROM Users WHERE id=@id'); res.send('删除成功'); }); module.exports = router; 参数化查询是重点。用@name这种占位符,别用字符串拼接。拼接SQL等于把数据库大门敞开,谁都能注入。mssql的input方法会自动处理类型转换和转义,省事又安全。
主文件app.js把路由挂上,加个body解析中间件。
const express = require('express'); const app = express(); app.use(express.json()); app.use('/api', require('./routes')); app.listen(3000, () => console.log('服务跑在3000端口')); 测试用Postman或者curl都行。发POST请求到http://localhost:3000/api/users,body带JSON:{ "name":"张三","email":"zhangsan@test.com"}。查一下数据库,数据应该进去了。
有个细节值得说:mssql的连接池是懒加载的,第一次请求才会真正建立连接。如果你希望启动时就连接,在app.js里提前require一下db.js就行。
另外,SQL Server的NVarChar类型对应Unicode字符,存中文必须用它。用VarChar存中文会变成问号,这是编码问题,不是驱动bug。
整套流程跑下来,最耗时间的往往不是代码,而是SQL Server的配置。TCP/IP没开、端口没固定、防火墙拦了1433,这三个坑踩一个就够折腾半天。建议先在SSMS里用同样的账号密码连一次,确认服务端没问题再写代码。
代码量不大,但覆盖了Web连接SQL Server的核心模式:连接池管理、参数化查询、RESTful路由设计。把这套骨架搭好,后面加字段、加表、加事务都是在这个基础上扩展。
