搭建node + typescript搭建服务
npm init 生成 package.json 文件
安装 node 模块的 ts 声明文件
1
2npm install --save typescript
npm i --save @types/node目录结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18.
├── config.js // 配置文件,保存不同环境的全局变量(如数据库相关参数)
├── index.ts // 入口文件
├── package.json
├── src
│ ├── auth.js // 登录中间库
│ ├── controller // 接口相关
│ │ ├── comment.controller.ts
│ ├── service // 服务相关
│ │ ├── comment.service.ts
│ ├── types // 类型
│ │ └── BaseContest.ts
│ └── utils // 通用函数
│ ├── http.ts
│ ├── redis.ts
│ ├── statusCode.ts
│ └── token.ts
└── tsconfig.json // ts相关配置
入口文件
1 | import Koa from 'koa'; |
中间件
koa-body-parser 解析请求体
koa-body-parser 中间件用来解析http请求体,把koa2上下文的formData数据解析到ctx.request.body
Koa2-cors 解决跨域
由于浏览器同源策略,凡是发送请求url的协议、域名、端口三者之间任意一个与当前页面地址不同即为跨域。
koa2直接设置跨域
1 | app.use(async (ctx, next) => { |
使用中间件
1 | ..... |
自定义中间件
error_handler 错误处理中间件
处理所有内部函数抛出的错误
1 | import json from './json' |
./json 文件处理返回的函数
保证所有接口返回统一的结构
1 | import Koa from 'koa'; |
自定义中间件 Auth 获取当前用户数据
可以自定义已些全局的中间件,此处以获取当前用户信息为例:
1 | // 自定义的type,继承自Koa.ExtendableContext,添加了userInfo |
🍃 下面看下tokenUtils里做了什么
这里使用了redis来缓存token和用户信息的映射,从而避免平凡获取用户信息
给每个检制度对设定了清空时间,以保证token的安全性
1 | const { setRedis, getRedis } = require('./redis'); |
koa-router 处理url映射
安装
1 | npm install koa-router --save |
以login为例🌰:
1 | import Koa from 'koa'; |
注册到app,index.ts
1 | ........ |
封装http
当node需要以http的方式调用其他服务,且需要对这些请求做同意处理时,可以封装一个http的函数
1 | const axios = require('axios'); |
Redis使用
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库
apiDoc 生成接口文档
安装依赖
1 | npm install apidoc |
在你的项目根目录下新建apidoc.json文件,该文件描述了项目对外提供接口的概要信息如名称、版本、描述、文档打开时浏览器显示标题和接口缺省访问地址。
apidoc.json :
1 | { |
使用说明
HTTP接口调用方法、路径及名称
@api {method} path [title]名称
@apiName {name}分组
@apiGroup {name}请求头参数
@apiHeader [(group)][{type}] [field=defaultValue][description]请求参数
@apiParam [(group)][{type}] [field=defaultValue][description]返回数据描述
@apiSuccess [(group)][{type}] field [description]接口成功返回样例
@apiSuccessExample [{type}][title] {example}接口失败描述
@apiError [(group)][{type}] field [description]接口失败返回样例
@apiErrorExample [{type}][title] {example}使用模板
@apiUse {name}name->模板名1
2
3
4
5
6
7
8
9
10/**
* @apiDefine MySuccess
* @apiSuccess {string} firstname The users firstname.
* @apiSuccess {number} age The users age.
*/
/**
* @api {get} /user/:id
* @apiUse MySuccess
*/
文档生成
生成api文档,在package.json中添加生成api的指令
1 | { |