【问题标题】:Extending session object in express-session在快速会话中扩展会话对象
【发布时间】:2021-04-24 13:13:04
【问题描述】:

我知道这不是实际问题,而是需要帮助。

我在 typescript 和 express session 上苦苦挣扎,我一直在玩,并试图弄清楚这个问题。

我正在尝试扩展我的会话对象,为此,我正在尝试按照文档中的内容进行类型合并:

我有一个types/session.d.ts,需要合并以下接口:

declare module 'express-session' {
  interface SessionData {
    userId: string;
  }
}

但这不起作用,例如,other-folder/some.ts

req.session.userId = user.id;
// Property 'userId' does not exist on type 'Session & Partial<SessionData>'.

但是,如果我从 express-session 导入 Session,它确实有效:

import { Session } from 'express-session'

declare module 'express-session' {
  interface SessionData {
    userId: string;
  }
}

我对 TypeScript 不是很精通,我不确定在类型定义中导入模块,事件 TypeScript 抱怨这个(警告):

“会话”已声明,但其值从未被读取。

我想知道,这是解决问题的正确方法吗?

我可以做些什么不同的事情?

亲切的问候!

PS:我的 tsconfig 应该没问题,因为我可以通过我的代码获得其他类型定义,并且它们完全没有问题。

【问题讨论】:

    标签: typescript express express-session


    【解决方案1】:

    您应该使用Module Augmentation。你也应该从Modules知道这一点:

    在 TypeScript 中,就像在 ECMAScript 2015 中一样,任何包含顶级导入或导出的文件都被视为一个模块。相反,没有任何顶级导入或导出声明的文件被视为脚本,其内容在全局范围内可用(因此也可用于模块)。

    例如:

    ./src/main.ts:

    import express from 'express';
    import session from 'express-session';
    
    const app = express();
    
    app.use(
      session({
        secret: 'keyboard cat',
        resave: false,
        saveUninitialized: true,
        cookie: { secure: true },
      }),
    );
    app.get('/', (req, res) => {
      const user = { id: '1' };
      req.session.userId = user.id;
    });
    

    ./types/session.d.ts:确保包含至少一个顶级importexport 以将此文件作为模块,而不是其内容在全局范围内可用的脚本。有时,您会从第三方节点模块导入和使用一些接口或类型。但在你的情况下,你不需要它。所以就用export {}或者import 'express-session'就行了。

    declare module 'express-session' {
      interface SessionData {
        userId: string;
      }
    }
    
    export {};
    

    tsconfig.json:

    "typeRoots": [
      "./node_modules/@types",
      "./types",
    ], 
    

    软件包版本:

    "express": "^4.17.1",
    "@types/express": "^4.17.11",
    "typescript": "^3.9.7"
    "express-session": "^1.17.1",
    "@types/express-session": "^1.17.3",
    

    【讨论】:

    • 好吧,这似乎可行,但我有点怀疑在 d.ts 上导入 express-session 或导出一个空对象。我真的没有正确理解它。不是节点中的所有文件都考虑一个模块吗?为什么 d.ts 文件需要成为一个模块才能工作?我发现的所有示例和教科书都只是在没有这个的情况下合并。我只是担心这是一个打字稿黑客。
    猜你喜欢
    • 2021-10-22
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 2012-09-27
    • 2016-07-06
    • 2019-04-28
    • 2022-08-06
    相关资源
    最近更新 更多