=expree构建一个极简的服务器
var express = require('express')
//引入HTTP请求体解析的中间件 负责解析JSON、Raw、文本、URL-encoded格式的请求体,
var bodyParser = require('body-parser')
// var http = require('http')
//用框架创建服务器
var app = express()
let obj = [
{ id: 1, name: 'zhangsan' },
{ id: 2, name: 'zhangsan2' },
{ id: 3, name: 'zhangsan3' },
{ id: 4, name: 'zhangsan4' },
]
// //配置body-parser
app.engine('html', require('express-art-template'));
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
app.use(bodyParser.json())
app.get('/', function (req, res) {
//当发起get请求路径后渲染render里的文件
res.render('./index.html')
})
app.get('/abod', function (req, res) { 当请求abod页面后 将obj的数据以json格式打印到页面
res.json(obj)
})
app.post('/post', (req, res) => { //当前端发起post请求后
res.redirect('/abod') //这里是做了路由跳转的操作
})
// app.use('/public/', express.static('./public/'))
app.listen(3001, () => { //服务器配置端口和启动后回调函数
console.log('服务器启动');
})
用Koa2构建服务器
//服务器入口文件
const Koa = require('koa')
const app = new Koa()
//总耗时中间件
const dateMiddleware = require('./middleware/koa_response_duration')
app.use(dateMiddleware)
//响应头中间件
const headeMiddleware = require('./middleware/koa_response_header')
app.use(headeMiddleware)
//获取数据的中间件
const dataMiddleware = require('./middleware/koa_response_data')
app.use(dataMiddleware)
app.listen(3000, () => {
console.log('服务器启动')
})
总耗时中间件
//计算服务器总耗时中间件
module.exports = async (ctx, next) => {
//第一层中间件开始执行事件
const start = Date.now()
await next()
//最后一层中间件执行事件结束
const stop = Date.now()
const duration = stop - start
//设置xiangyingtou
ctx.set('X-Response-Time', duration + 'ms')
}
响应头中间件
//设置响应头中间件
module.exports = async (ctx, next) => {
//指明字符编码的请求头
const contentType = 'application/json; charset=utf-8'
ctx.set('Content-Type', contentType)
//解决跨域的请求头
ctx.set('Access-Control-Allow-Origin', '*')
ctx.set('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS')
await next()
}
获取数据的中间件
//读取数据的中间件
const path = require('path')
//引入file_utils读取json文件数据
const fileUtils = require('../utils/file_utils')
module.exports = async (ctx, next) => {
//获取当前请求url路径
let url = ctx.request.url
//拿到处理完的url然后拼接需要的路径
let filePath = url.replace('/api', '')
filePath = '../data' + filePath + '.json'
//获取需要的文件的绝对路径
const defpath = path.join(__dirname, filePath);
//当输入错误的url后抛出错误打印json对象里的文字
try {
let ret = await fileUtils.getFileJsonData(defpath)
ctx.response.body = ret
} catch (error) {
const errorMsg = {
message: '读取文件失败,或文件资源不存在',
status: 404
}
ctx.response.body = JSON.stringify(errorMsg)
// ctx.response.body = errorMsg
}
await next()
}
file_utils文件
//读取文件的工具方法
const fs = require('fs')
module.exports.getFileJsonData = (filePath) => {
return new Promise((res, rej) => {
fs.readFile(filePath, 'utf-8', (error, data) => {
if(error) {
rej(error)
} else {
res(data)
}
})
})
}
其中最重要的next()是一个中间件放行的钥匙,只有通过这个路口文件的几层中间件才能继续执行下去,然后它的中间件被称为洋葱中间件。
比如有三层中间件,执行顺序就是 1 => 2 => 3 => 2 => 1,在执行完正序的最后一层中间件后,逆序的中间件代码就是执行next()后面的代码
//服务器入口文件
const Koa = require('koa')
const app = new Koa()
app.use((ctx, next) => {
console.log('1')
next()
console.log('11');
})
app.use((ctx, next) => {
console.log('2')
next()
console.log('22');
})
app.use((ctx, next) => {
console.log('3')
next()
console.log('33');
})
app.listen(3000, () => {
console.log('服务器启动')
})
输出的结果