项目初始化

新建一个文件夹,然后在文件夹中打开命令行,输入以下命令:

npm init -y

安装express

npm install express --save

为了方便开发,我们还需要安装一个工具nodemon,它可以帮助我们监听文件的变化,自动重启服务。

npm install nodemon --save-dev

通过nodemon app.js启动服务,这样当我们修改代码时,服务会自动重启,不需要我们手动重启服务。 也可以在package.json中配置启动命令:

"scripts": {
"start": "nodemon app.js.md"
},

然后通过npm start启动服务。

基本使用

我常用的项目基本目录结构如下:

├── config
├── controllers
├── middlewares
├── model
├── public
├── router
├── utils
├── validator
    app.js
    package.json
    package-lock.json

各个目录的说明如下:

目录说明
config用来存放配置文件,例如token的密钥等
controllers用来存放控制器,我们在这里编写业务逻辑
middlewares用来存放中间件
model用来存放模型,我们在这里定义数据模型
public用来存放静态资源
router用来存放路由文件
utils用来存放工具函数
validator用来存放校验器,我们在这里定义校验规则
app.js项目入口文件

路由

路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求。

在项目中,我们可以通过app.get()、app.post()、app.put()等方法创建一个路由。

例如

app.get('/', function (req, res) {
  res.send('Hello World!')
})

完整代码如下:

const express = require('express')
const app = express()

app.get('/', function (req, res) {
  res.send('Hello World!')
})

app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
})

模块化

在实际开发中,我们通常会把路由、数据库等都封装成模块,然后在app.js中引入使用。

例如,我们在项目根目录下新建一个routes文件夹,然后在文件夹中新建一个index.js文件,代码如下:

const express = require('express')
const router = express.Router()

router.get('/', function (req, res) {
  res.send('Hello World!')
})

module.exports = router

分离路由处理函数

在实际开发中,我们通常会把路由处理函数分离出来,例如:

// routes/index.md.js.md
const express = require('express')
const router = express.Router()
const userController = require('../controllers/userController')

router.get('/', userController.index)

module.exports = router
// controllers/userController/index.md
exports.index = function (req, res) {
  res.send('Hello World!')
}

app.js中引入路由:

const indexRouter = require('./routes/index.md')
app.use('/', indexRouter)

这样,我们就可以把路由处理函数分离出来,方便管理。

完整代码

// app.js.md
const express = require('express')
// 日志输出
const morgan = require('morgan')
const cors = require('cors')
const errorHandler = require('./middleware/error-handler')
const {jwtSecretKey} = require("./index.md/index.md")
const expressJWT = require('express-jwt')
const expressIp = require('express-ip')
const app = express()
app.use(expressIp().getIpInfoMiddleware)

// 路由
const adminRouter = require('./router/admin')

app.use(cors())
app.use(morgan('dev'))
app.use(express.json())
app.use(express.urlencoded({extended: false}))
app.use('/uploads', express.static('./public/upload'))

// 配置解析token的中间件
app.use(expressJWT({
  secret: jwtSecretKey,
}).unless({path: [/^\/api\/admin/, /^\/api\/admin\/sendMessage/, /^\/api\/permission/, /^\/api\/admin\/sendEmailTemp/, /^\/api\/admin\/chatGPT/, /^\/api\/student\/upload\//, /^\/api\/student\/importExcel/]}))

// 路由
app.use('/api/admin', adminRouter)

// 错误处理中间件
app.use(errorHandler())

app.listen(8080, () => {
  console.log(`Server running on http://127.0.0.1:8080`)
})

后续章节会详细介绍各个模块的使用。

快速安装各种依赖

npm install express --save
npm install nodemon --save-dev
npm install morgan --save
npm install cors --save
npm install express-jwt --save
npm install express-ip --save
npm install jsonwebtoken --save
npm install multer --save
npm install dayjs --save
npm install joi --save

各种依赖版本

"dependencies": {
  "cors": "^2.8.5",
  "dayjs": "^1.11.5",
  "express": "^4.18.1",
  "express-ip": "^1.0.4",
  "express-jwt": "^5.3.3",
  "joi": "^17.6.2",
  "jsonwebtoken": "^8.5.1",
  "morgan": "^1.10.0",
  "multer": "^1.4.5-lts.1",
}
Last Updated:
Contributors: huangdingxin, 黄定鑫