前言
在接触现在的新工作之前,我一直做的是纯前端的工作。虽然现在的岗位也是前端开发,但是后端接口也要自己用node写。所以想出一个小白锦囊系列,记录自己的一个积累经验的历程。
Node对接口返回结果进行统一封装处理
需求
对返回的结果res做统一的格式处理,包括错误码以及返回格式。同时要符合typescript语法校验规范。
思路
实现思路上有点类似于对axios的二次封装,对返回数据的统一包装错误处理,以及loading逻辑等。所以,对应的我准备在router.use上做一般处理。
实现
在总的抛出router接口中,中间层加上jsonSuccess、jsonFail的实现
// router文件下的index.ts
import express from 'express'
import { Response } from '../config/types/router-response'
import errorCode from '../config/error-code'
const router = express.Router()
router.use((req, res: Response, next) => {
res.jsonSuccess = (data): void => {
res.json({
code: 200,
message: 'success',
result: data,
})
}
res.jsonFail = (code, message): void => {
res.json({
code,
msg: errorCode[code] || message,
})
}
next()
})
export default router
// router-respons.d.ts文件
export * from 'express-serve-static-core'
declare module 'express-serve-static-core' {
interface Response {
jsonSuccess: (result: any, code: 200, message: 'success') => void
preProcessing: (data: any) => void
jsonFail: (code: number, message: string, extra?: any) => void
}
}
// error-code.ts
export default {
500: '服务器内部错误',
404: 'token失效'
......
}
使用例子
// test.ts
import express from 'express'
import TestModel from '../model/test-instance'
const router = express.Router()
router.post('/test', async (req, res) => {
try {
const result = TestModel.update({ test: '123' })
res.jsonSuccess(result)
} catch (e) {
res.jsonFail(500)
}
})
疑难杂点
.d.ts的后缀文件
学习生涯首次碰上.d.ts为后缀的文件,那么这类文件的作用是什么?
我们都知道,TypeScript是JavaScript的超集。我认为二者最大的区别就是ts加了强类型校验,类型校验集中体现在申明变量、函数传参、函数返回值中。
作用一:TS直接引用第三方JS库时有些包会缺乏类型检查,所以我们需要做一个声明文件,来声明这些第三方库的类型,否则eslint校验规则时就会爆红。
作用二:需要二次封装已有的数据类型,在上面添砖加瓦。(如上述我的实现)
相关的ts语法-declare
注意:在typescript的规则里面,如果一个.d.ts文件如果没有用到import或者export语法的话,那么最顶层声明的变量就是全局变量
// 申明一个aTest的全局变量
declare let aTest: number;
// 声明一个Get接口
declare interface Get{
id: string: string;
name:string: string;
}
// 声明一个对象
declare namespace myObj{
let age: number;
function getAge(age: number): number;
}
// 写一个模块化的类型
declare module 'test' {
const MAXYEAR:400
export=MAXYEAR
}