express服务端开发

安装express

已搭建好node环境,安装好mongodb数据库的情况下,安装express以及必要插件
npm i express -S
npm i body-parser -S
npm i cors -S

使用express

  • 新建一个项目文件夹nodeServer,在文件夹中新建一个server.js,内容如下
const express = require('express')
const bodyparser = require('body-parser')
const app = express()

// 解析表单数据 x-www-form-urlencode
app.use(bodyparser.urlencoded({ extended: false }))
// 解决跨域
app.use(cors())
// 解析json数据
app.use(bodyparser.json())

app.get('/user/login',(req, res) => {
  let {user,psw} = req.query
  if(user == 'admin' && psw == '123456'){
    res.send({err: 0, msg: 'login OK'})
  }else{
    res.send({err: -1, msg: 'login error'})
  }
})

// post消息体需要第三方插件解析,body-parser
app.post('/user/register',(req, res) => {
  let {user,psw} = req.body
  if(user == 'admin' && psw == '123456'){
    res.send({err: 0, msg: 'register OK'})
  }else{
    res.send({err: -1, msg: 'register error'})
  }
})

app.listen(3000, () => {
  console.log('server start')
})

在当前目录的终端中输入node server.js启动服务,简单的get、post服务器接口就完成了。

设置静态目录

// 将当前目录的static文件夹设置问静态目录public
app.use('/public', express.static(path.join(__dirname, './static')))

api文档

// 安装
npm i apidoc -g
  • 在你的项目根目录下新建apidoc.json文件,该文件描述了项目对外提供接口的概要信息如名称、版本、描述、文档打开时浏览器显示标题和接口缺省访问地址。
{
  "name": "ServiceAPI",
  "version": "1.0.0",
  "description": "XXX接口文档",
  "title": "ServiceAPI",
  "url" : "http://xxx"
}
  • 使用样例
/**
* @api {post} /user/reg 用户注册
* @apiName reg
* @apiGroup user
*
* @apiParam {String} us 用户名
* @apiParam {String} ps 密码
* @apiParam {String} code 验证码
*
* @apiSuccess {String} err: 0 注册成功
* 
*/
router.post('/reg', (req, res) => {
  // 获取数据
  let { us, ps, code } = req.body
  if (us && ps && code) {
    // 判断验证码是否正确
    if(codes[us] != code){
      return res.send({ err: -2, message: '验证码错误' })
    }
    User.find({ us })
      .then(data => {
        if (data.length === 0) {
          return User.insertMany({ us, ps })
        } else {
        res.send({ err: -2, message: '用户名已存在' })
        }
      })
      .then(data => {
        res.send({ err: 0, message: '注册ok' })
      })
      .catch((err) => {
        res.send({ err: -1, message: '注册失败' })
      })
  } else {
    return res.send({ err: -1, message: '参数错误' })
  }
})
  • 生成文档
    cd到apidoc.json所在路径(即项目根目录)执行如下命令即可
apidoc -i src/ -o apidoc/

执行成功后会生成apidoc文件夹,点开apidoc文件夹中index.html会发现已经生成api文档

mongoose

  • 安装mongoose
npm i mongoose -S
  • 在根目录新建db文件夹,然后db文件夹中新建model目录以及connect.js文件,内容如下
const mongoose = require('mongoose')
const db = 'mongodb://localhost/testdb'

exports.connect = () => {
  // 连接数据库
  mongoose.connect(db, { useNewUrlParser: true, useUnifiedTopology: true })
  let maxConnectTimes = 0

  return new Promise((resolve, reject) => {
    // 数据库监听事件
    mongoose.connection.on('disconnected', () => {
      console.log('数据库断开重连')
      if(maxConnectTimes <= 3){
        maxConnectTimes++
        mongoose.connect(db)
      }else{
        reject()
        throw new Error('数据库出现问题,请人为处理')
      }
    })

    mongoose.connection.on('error', (err) => {
      console.log('数据库断开重连')
      if(maxConnectTimes <= 3){
        maxConnectTimes++
        mongoose.connect(db)
      }else{
        reject(err)
        throw new Error('数据库出现问题,请人为处理')
      }
    })

    mongoose.connection.once('open', () => {
      console.log('数据库连接成功')
      resolve()
    })
  })
}
  • 在model目录下新建userModel.js内容如下
const mongoose = require('mongoose')
const Schema = mongoose.Schema
const userSchema = new mongoose.Schema({
  userID: Schema.Types.ObjectID,
  account: {type: String, required: true},
  password: {type: String, required: true},
  name: {type: String, required: true},
  sex: {type: Number, default: 0},
  createAt: {type: Date, default: Date.now()}
}, { collection: 'user' })
// collection将mongodb默认取名方式改为指定名

// 改数据对象和集合关联('集合名', schema对象)
module.exports = mongoose.model('user', userSchema)

Router

  • 在根目录新建一个router目录,在router中新建userRouter.js内容如下
const express = require('express')
const router = express.Router()
const User = require('../db/model/userModel')

router.post('/login', (req, res) => {
  let { us, ps } = req.body
  if (!us && !ps) { return res.send({ err: -1, message: '参数错误' }) }
  User.find({ us, ps })
    .then(data => {
      if (data.length > 0) {
        res.send({ err: 0, message: '登录成功' })
      } else {
        res.send({ err: -2, message: '用户名或密码不正确' })
      }
    })
    .catch(err => {
      return res.send({ err: -1, message: '内部错误' })
    })
})
module.exports = router

server

  • server.js内容如下
const express = require('express')
const {connect} = require('./db/connect')
const path = require('path')
const app = express()
const cors = require('cors')

const bodyparser = require('body-parser')
// 解析表单数据 x-www-form-urlencode
app.use(bodyparser.urlencoded({ extended: false }))
// 解析json数据
app.use(bodyparser.json())
// 解决跨域
app.use(cors())
// 设置静态目录
app.use('/public', express.static(path.join(__dirname, './static')))

const userRouter = require('./router/userRouter')
app.use('/user', userRouter)

// 立即执行函数,连接数据库
;(async () => {
  await connect()
})()

app.listen(3000, () => {
  console.log('server start, port: 3000')
})

文章作者: Hao Jie
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Hao Jie !
  目录