NodeJS操作SQL Server数据库实战

4,390 阅读3分钟

最近的项目有用到NodeJS对SQL Server数据库进行简单的增删改查操作,下面就针对相关的流程进行一下简单的记录。

安装相关依赖包

  • koakoa-routerkoa-bodyparserkoa-body 这里使用koa框架编写服务端,轻便快捷
  • nodemon 使用nodemon随时监听文件的变更,自动重启服务,我们开发时只需关注代码即可,不再需要手动重启服务
  • mssql MSSQL 是Nodejs用于连接Microsoft SQL Server 的插件

相关命令如下:

npm init //填写项目相关信息
npm install koa koa-router koa-bodyparser koa-body mssql
npm install nodemon -g

修改package.json配置

  • scripts加入"start": "nodemon app"使用nodemon启动(这样后续修改代码就会自动更新啦~)

修改后的package.json如下:

{
  "name": "demo",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "nodemon app"
  },
  "author": "xpsilvester",
  "license": "ISC",
  "dependencies": {
    "koa": "^2.13.1",
    "koa-body": "^4.2.0",
    "koa-bodyparser": "^4.3.0",
    "koa-router": "^10.0.0",
    "mssql": "^7.1.0"
  }
}

编写路由

  • 新建routes.js, 具体代码如下:
const Router = require('koa-router')   //路由模块
const router = new Router()

router.get('/index', async (context, next) => {
    context.body = {
      data: { get: 1 },
      status: 0
    }
})

module.exports = router
  • 新建app.js,具体代码如下:
const Koa = require('koa')
const app = new Koa()
const JSON_MIME = 'application/json'    //json类型
const router = require('./routes')  //路由
const bodyParser = require('koa-bodyparser')
const koaBody = require('koa-body')

app.use(koaBody({
  multipart: true,  // 支持表单上传
  formidable: {
    maxFileSize: 10 * 1024 * 1024, // 修改文件大小限制,默认位2M
  }
}))

app.use(async (context, next) => {
  context.type = JSON_MIME
  await next()
})

app.use(bodyParser())
app.use(router.routes())
app.use(router.allowedMethods())

app.listen(8010)
console.log('app start at 8010')
  • 运行demo

在命令行输入:

npm start

在浏览器打开http://localhost:8010/index,显示如下,说明初步代码跑通了

{"data":{"get":1},"status":0}

连接SQL Server数据库

  • 新建db文件夹,在文件夹中新建db.js,具体代码如下:
//db.js
const sql = require('mssql');
//连接方式1:"mssql://用户名:密码@ip地址(无需端口号)/SqlServer名/数据库名称"
//连接方式2:"mssql://用户名:密码@ip地址:1433(默认端口号)/数据库名称"

//这里采用连接方式2
const dbconfig = "mssql://sa:123456@xxx.xx.x.xxx:1433/mydata" 

const SQLQuery = function (queryStr) {
  return sql.connect(dbconfig).then(function () {
    return new sql.Request().query(queryStr)
    // Stored Procedure
  }).catch(function (err) {
    console.log(err);
  });
}

module.exports = SQLQuery

假设有 users表如下:

idnameage
1小王18
2小李17

users表进行增删改查

  • 新建controller文件夹,在文件夹中新建User.js,具体代码如下:
const SQLQuery = require('../db/db')

module.exports = {
    //新增用户
    async addUser (name,age) {
        let res = await SQLQuery(`insert into users (name,age) values ('${name}','${age}')`);
        return res
    },
    //获取用户列表
    async getUserList () {
        let userlist = await SQLQuery(`select * from users`);
        return userlist.recordset
    },
    //更新用户列表
    async updateUserList(name,age){
        let res = await SQLQuery(`update users set age = ${age} where name = '${name}'`)
        return res
    },
    //删除用户
    async delUser(id){
        let res = await SQLQuery(`delete from users where id = ${id}`)
        return res
    }
}
  • 修改路由文件routes.js,具体代码如下:
const Router = require('koa-router')   //路由模块
const router = new Router()
const User = require('./controller/User') //引入user

router.get('/index', async (context, next) => {
    context.body = {
      data: { get: 1 },
      status: 0
    }
})

//获取用户列表
router.get('/userlist', async (context, next) => {
    let userlist = await User.getUserList()
    context.body = {
      data: userlist
    }
})

//新增用户
router.post('/addUser', async (context, next) => {
    console.log(context.request.body)
    let body = context.request.body;
    let res = await User.addUser(body.name,body.age)
    context.body = {
      data: res
    }
})

//更新用户列表
router.post('/updateUserList', async (context, next) => {
    console.log(context.request.body)
    let body = context.request.body;
    let res = await User.updateUserList(body.name,body.age)
    context.body = {
      data: res
    }
})

//删除用户
router.post('/delUser', async (context, next) => {
    console.log(context.request.body)
    let body = context.request.body;
    let res = await User.updateUserList(body.id)
    context.body = {
      data: res
    }
})
  
module.exports = router

这样使用Node连接SQL Server数据库,能够进行简单增删改查的服务端就已经完成了。

使用orm框架

以上代码主要是直接编写sql语句进行数据库操作,除此之外,还可以使用现成的orm框架。orm简单的讲就是对SQL查询语句的封装,让我们可以用OOP的方式操作数据库,优雅的生成安全、可维护的SQL代码。直观上,是一种Model和SQL的映射关系。

  • TypeORM: 详细介绍见 TypeORM 官方介绍,这个文档写的非常详细,感兴趣的朋友可以了解一下。
  • Sequelize: 文档见 Sequelize,被star数最多了一个ORM框架,体构造也容易上手,操作简单,容易理解。