小白锦囊系列-Node接口数据Response封装(一)

1,321 阅读2分钟

前言

在接触现在的新工作之前,我一直做的是纯前端的工作。虽然现在的岗位也是前端开发,但是后端接口也要自己用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
 }