项目初始化
新建一个文件夹,然后在文件夹中打开命令行,输入以下命令:
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",
}