segmentfault官方|为 Express 开外挂


北京联盟_本文原题:为 Express 开外挂
作者:pingan8787
来源:SegmentFault 思否社区
本项目源码地址:
https://github.com/pingan8787/Leo-Java/blob/master/Cute-Gist/LearnSource/OvernightDemo/
随着 Nodejs 在前端涉及领域越来越广 , 也越来越成熟 , 相信很多朋友已经尝试或使用过 Nodejs 开发服务端项目了 。
本文我将和大家一起回顾 Express , 然后介绍一个超级外挂——OvernightJS , 它强大的地方在于 , 它将为 Express 路由提供 Type 装饰器支持 , 使得我们开发路由更加简单 , 代码复用性更好 。这里也希望帮助大家对 Type 的装饰器有更深了解 。
一、背景介绍
最近 Leo 打算使用 Express 来开始重构自己博客的服务端项目 , 经过认真研究和设计 , 并确定完方案 , Leo 开始下手啦:
// app.ts
import express, { Application, Request, Response } from 'express';
const app: Application = express;
app.get( '/', (req: Request, res: Response) => {
res.send( 'Hello World!');
});
app.listen(3000, => {
console.log( 'Example app listening on port 3000!');
});
其中 tsconfig.json 配置如下:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"experimentalDecorators": true, // 开启装饰器
"emitDecoratorMetadata": true, // 开启元编程
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
}
}
基本代码写完 , 测试能不能跑起来 。
Leo 在命令行使用 ts-node 命令行执行 。 (ts-node 用来直接运行 ts 文件 , 详细介绍请查看文档 , 这里不细讲咯):
$ ts-node app.ts
看到命令行输出:
Example app listening on port 3000!
服务跑起来了 , 心情愉快 。
接下来 Leo 使用 Express 的路由方法写了其他接口:
// app.ts
app.get( '/article', (req: Request, res: Response) => {res.send( 'Hello get!')});
app.post( '/article', (req: Request, res: Response) => {res.send( 'Hello post!')});
app.put( '/article', (req: Request, res: Response) => {res.send( 'Hello put!')});
app.delete( '/article', (req: Request, res: Response) => {res.send( 'Hello delete!')});
app.get( '/article/list', (req: Request, res: Response) => {res.send( 'Hello article/list!')});
// ... 等等其他接口
Express 路由方法派生自 HTTP 方法之一 , 附加到 express 类的实例 。 支持对应于 HTTP 方法的以下路由方法:get、post、put、head、delete、options等等 。
同事 Robin 看了看代码 , 问到:
segmentfault官方|为 Express 开外挂
本文插图

随着接口越写越多 , 代码不免出现复杂和冗余的情况 , 为了解决这个问题 , Leo 引入 Express 的 Router, 来 创建可安装的模块化路由处理程序 。 Router 实例是完整的中间件和路由系统 。 因此 , 常常将其称为“微型应用程序” 。
Leo 新建文件 app.router.ts, 重新实现上面接口:
// app.router.ts
import express, { Router, Request, Response } from 'express';
const router: Router = express.Router;
router.get( '/', (req: Request, res: Response) => {res.send( 'Hello get!')});


推荐阅读