微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有自定义预期字段的 Express 路由器请求

如何解决带有自定义预期字段的 Express 路由器请求

我正在将基于 JS 的 express 应用程序重写为 Typescript。在重构路由器实例时,我偶然发现了以下问题:

this.router.get('/tenantInfo',(req,res) => {
  res.send(this.getTentantInfo(req.tenant))
})

当我想将其转换为 Typescript 时,它看起来像这样:

import express,{ Request,Response,Router } from 'express'

this.router.get('/tenantInfo',(req: Request,res: Response) => {
  res.send(this.getTentantInfo(req.tenant))
})

导致 req.tenant 出错,因为 Request 没有这个属性。我搜索了 Stackoverflow 并找到了 this answer,但是,我认为如果我只是使用每个和 每个附加属性扩展 express 的 Request 接口,这不会导致良好的应用程序结构> 我希望在我的应用程序的各个地方

以干净且可维护的方式解决此问题的好方法是什么?

解决方法

您可能需要在使用前检查 tenant,例如:

this.router.get('/tenantInfo',(req: Request,res: Response) => {
  if(req.tenant){
      res.send(this.getTentantInfo(req.tenant))
  }

  res.send({
     message: "Your error message..."      
  })
})

我不确定,但测试一下,看看它是否能解决您的问题

,

这可能不会增加我的评论,但您也可以将 .d.ts 文件分隔到多个位置。假设你有这个目录结构

.
└── src
    ├── tenant
    │   ├── request.d.ts
    │   └── routes.ts
    ├── some
    │   ├── interface.ts
    │   ├── some.d.ts
    │   └── routes.ts
    ├── other
    │   └── ...
    └── stuff
        └── ...

tenant/request.d.ts

declare namespace Express {
  interface Request {
    tenant?: string;
  }
}

some/interface.ts

export interface Some {
  foo: string;
  bar: string;
}

并在some/request.d.ts

import { Some } from "./interfaces"; 

declare namespace Express {
  interface Request {
    some?: Some;
  }
}

同样适用于 otherstuff...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。