繁体   English   中英

Express 的自定义字段在路由中找不到

[英]Express's custom fields cannot be found in routes

我在customExpress.d.ts有一个扩展类型:

declare namespace Express {
  export interface Request {
    user: {
      id: string;
    };
  }
}

并且还在 tsconfig.json 中处理:

 ...
 "typeRoots": ["src/customExpress.d.ts", "node_modules/@types"],
  "files": ["src/customExpress.d.ts"],
 ...

我可以直接在 express 应用程序的中间件中使用它:

const app = express();
app.use('/authUrl', authenticationMiddleware);

具有以下定义:

const authenticationMiddleware = (req: express.Request, _: express.Response, next: express.NextFunction): void => {
 ...
 req.user = {id: 'aaaaa'}
 next();
}
export default authenticationMiddleware;

但是,以下内容将不起作用:

const authorize = (req: express.Request, _: express.Response, next: express.NextFunction): void => {
 ...
 if (!req.user.id) {
   next(new Error('not authorized'));
 } else {
   next();
 }
}

以下用法时:

const routes = express.Router({ mergeParams: true });

routes.get('/', authorize, handler.listAll);

上面的代码会报错:

authorize.ts(16,17): error TS2339: Property 'user' does not exist on type 'Request'.

所以它抱怨我在 authorize.ts 文件中定义的req.user的使用。

基本上,如果我在 express object 中使用中间件,自定义 express object 可以正常工作,但是如果我想在路由 object 中使用自定义 express,它将无法正常工作。 我的猜测是创建routes object 的方式(通过express.Router )将无法识别我的自定义快递并回退到默认快递 object,因此自定义字段将不起作用。

我该怎么办?

我不确定,但类型定义只是在编译时检查的东西,运行时没有类型,因为 js 运行,所以如果 req 中没有用户 object,它会抛出错误。

做你想做的事,我认为最好使用护照,它会做你的身份验证,并在用户通过身份验证时附加用户 object 。

我终于意识到问题出在它用于运行的方式上:

"start:stable": "rm -rf dist && npm run build && node -r ts-node/register -r tsconfig-paths/register dist/src",
"build": "tsc",
"start": "nodemon"

问题是npm run build ,这基本上是tsc成功构建代码。 然而第二部分, ts-node尝试再次构建它。 但是,在构建时,默认的tsconfig.json位置应该位于目标文件夹中,即dist/src ,当然不是这样。 tsc不会按照配置处理tsconfig.json文件。 因此, ts-node无法处理代码,因为它没有 tsconfig 中提供的tsconfig定义。

解决方案是,因为我已经在ts-node之前做tsc了,所以不需要重复同样的工作, ts-node可以只为node做转译。

答案是将start:stable命令更改为:

rm -rf dist && npm run build && node -r ts-node/register/transpile-only -r tsconfig-paths/register dist/src

我还发现了一些有趣的事情:默认情况下, ts-node不支持tsconfigfiles字段。 由于我正在添加自定义类型合并,因此需要files ,并且方法是在运行ts-node时放置一个--files标志。

这里有关于这个主题的资源和灵感:

https://github.com/TypeStrong/ts-node#programmatic

https://github.com/TypeStrong/ts-node/issues/782

https://github.com/TypeStrong/ts-node/issues/138

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM