deno-http-middleware
Deno 原生 HTTP 服务器的中间件框架
这个中间件框架受到Koa的启发
介绍
createHandler函数
根据中间件创建一个请求处理函数
接收参数middleware:中间件Middleware的数组
接受可选参数 notfoundHandler:自定义全局未找到错误处理函数。
接受可选参数 error_handler:自定义错误处理函数
接受可选参数 response_builder:自定义响应构建函数
接受可选参数 ret_processor:自定义中间件返回值处理函数
中间件函数Middleware
可以是异步函数
接受参数上下文context对象和调用下一个中间件的函数next
可以返回Response或者Request或者{response:Response,request:Request}或者Response的部分属性,来修改上下文Context中的请求和响应对象,
也可以不返回,不做任何修改
返回的Response的部分属性中的body可以是任何类型,可以添加自定义中间件来把指定类型的body转换成原生Response接受的body类型.
上下文context对象
包含属性connInfo:连接的信息
包含属性request:原生Request对象或者Request对象的部分属性
包含属性response:原生Response对象或者Response对象的部分属性
自带中间件
conditional_get:条件GET请求中间件
cors_all:完全跨域中间件
logger:日志中间件
json_builder:JSON响应中间件,并附带etag响应头
etag_builder:附带etag响应头的中间件
安装教程
Deno1.21.1
使用说明
也可以从 deno.land导入
https://deno.land/x/masx200_deno_http_middleware/mod.ts
https://deno.land/x/masx200_deno_http_middleware/middleware.ts
使用自带的中间件
import {
conditional_get,
cors_all,
etag_builder,
json_builder,
logger,
} from "https://cdn.jsdelivr.net/gh/masx200/deno-http-middleware@1.0.0/middleware.ts";
const handler = createHandler([
logger,
conditional_get,
cors_all,
json_builder,
etag_builder,
]);hello world
简单的例子
import { serve } from "https://deno.land/std@0.138.0/http/server.ts";
import { createHandler } from "https://cdn.jsdelivr.net/gh/masx200/deno-http-middleware@1.0.0/mod.ts";
const port = Math.floor(Math.random() * 10000 + 10000);
const handler = createHandler([
async (ctx, next) => {
console.log(1);
await next();
console.log(3);
},
(ctx) => {
console.log(2);
return { body: "hello world," + ctx.request.url };
},
]);
const p = serve(handler, { port: port });
await p;json builder
自带的 json 响应构建中间件的部分代码
import { isPlainObject } from "../deps.ts";
import { JSONResponse } from "../response/JSONResponse.ts";
import { Middleware, RetHandler } from "../src/Middleware.ts";
export const json_builder: Middleware = async function (
context,
next,
): Promise<RetHandler> {
await next();
const { response } = context;
const { body } = response;
return response instanceof Response
? response
: Array.isArray(body) || isPlainObject(body)
? await JSONResponse(response)
: void 0;
};