koa2 文件服务器,怎样用express或Koa2实现一个极简的本地服务器

=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('服务器启动')

})

5a22d0357533

5a22d0357533

输出的结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值