node.js - 使用 Typescript 向 expressjs 中的 req 对象添加属性
问题描述
我尝试将我的快速服务器代码从 js 迁移到 typescript,并在尝试访问我在自己的中间件函数中添加到请求对象的字段时遇到了问题。
例如,我正在做这样的事情:
app.use((req, res, next) => {
let account = checkAuthentication(req);
if(account) {
req.authenticated = true;
req.account = account;
next();
}
});
现在我想稍后在我的其他中间件函数中访问这些属性,但是 @types/express 中的 .d.ts 文件当然对于所有中间件函数都以相同的方式定义了 req 对象。
现在我想出了两种方法来解决这个问题,但看起来都很糟糕:
- 在每个中间件函数中使用 typeguard。但是后来我在 js 输出中添加了无用的代码,因为我的路由设置方式使我在“编译”时知道我的 req 对象在每个中间件函数中的形状。
- 在每个中间件函数中使用类型断言。但是,尽管我编写了代码以便在编译时知道所有类型,但我并没有得到打字稿的好处,因为那时我基本上禁用了 req 对象的类型检查。
所以我的问题是:如果有的话,我如何在那种情况下使用类型检查?如果我不能,这是否意味着像 express 这样的框架在静态类型语言(如 C#)中是不可能的?
解决方案
您可以使用模块扩充来扩展模块中Request
定义的类型express
declare global {
namespace Express {
export interface Request {
account: Account;
authenticaticated: boolean
}
}
}
推荐阅读
- sparql - Virtuoso SPARQL Bug 与 BIND
- c# - 如何在 Azure Function 中定义“外部”StorageAccount?
- php - How to setup an existing php project which used composer in a localhost with xampp?
- css - How to make table width auto with d3.js
- java - Removing list of objects from repository with Spring Data usage
- python - GCP App Engine 中的 Python 语法错误
- css - 如何在 vue-bootstrap 表模板中添加 css
- r - 在 R 中获取 data.frame 中元素差异的最快方法
- app-store-connect - 如何在应用商店连接中更改我的帐户的公司名称?
- javascript - 检查 JS 上的无限值