如何在 Typescript 项目中使用 express-mysql-session?

Posted

技术标签:

【中文标题】如何在 Typescript 项目中使用 express-mysql-session?【英文标题】:How to use express-mysql-session in Typescript projects? 【发布时间】:2017-12-08 19:19:33 【问题描述】:

我正在尝试在 Typescript 项目中使用 express-session 和 express-mysql-session。这是我的代码的相关部分:

import * as express from "express";
import * as expressSession from "express-session";
import * as expressMySqlSession from "express-mysql-session";

this.express = express();
const sessionStore = new expressMySqlSession(sessionStoreConfig, this.dbConnection);
const sessionHandler = expressSession(
                ...,
                store: sessionStore
            );
this.express.use(sessionHandler);

它无法编译,因为store 选项的类型为expressSession.Store | expressSession.MemoryStore | undefined,而sessionStore 的类型为MySQLStore。 我做错了什么?

问候

【问题讨论】:

注意session 是如何传递给require('express-mysql-session') in the example code 的结果的,这是您似乎缺少的一个步骤。 嗯,是的,你是对的,但是这个调用在 ES6 语法中会是什么样子呢?以下几行应该是等价的,对吧? import * as expressSession from "express-session"; import expressSession = require("express-session"); 第一个是较新的 ES6 语法。但是我将如何用 ES6 语法编写 require("xyz")(someparameter) 呢?除此之外,这真的可以解决类型不匹配吗? 这很难看,但添加: regenerate: (req: any, fn: (err?: any) => any) => void; load: (sid: string, fn: (err: any, session?: any | null) => any) => void; createSession: (req: any, sess: Express.SessionData) => void; all: (callback: (err: any, obj?: [sid: string]: any; | null) => void) => void;到 index.d.ts 中的 MySQLStore 声明解决了它。 【参考方案1】:

express-sessionexpress-mysql-session@types/express-mysql-session 列为依赖项:

Current version of the types(大约两年前)跟踪旧版本的express-mysql-session,其中默认导出是类。幸运的是,这个旧版本的库中有一些backwards-compatibility,所以你可以直接实例化它:

import MySQLSessionStore from "express-mysql-session";

const store = new MySQLSessionStore(...);

图书馆会为你处理importing the express-session dependency。

代码从不说谎!

【讨论】:

忘记添加 @types/express-mysql-session 为我解决了一个问题。【参考方案2】:
import * as express from 'express';
import * as session from 'express-session';
const MySQLStore = require('express-mysql-session')(session);

import pool from './database';
const sessionStore = new MySQLStore(
  schema: 
    tableName: 'mire_sessions',
    columnNames: 
      session_id: 'session_id',
      expires: 'expires',
      data: 'data'
    
  
, pool);

const app = express();
app.use(session(
  secret: 'z',
  resave: false,
  saveUninitialized: true,
  store: sessionStore
))

这段代码对我有用。但我不知道为什么

【讨论】:

【参考方案3】:

试试这个:

import * as express        from "express";
import * as expressSession from "express-session";
import expressMySqlSession from "express-mysql-session";

const MySQLStore   = expressMySqlSession(expressSession);
const sessionStore = new MySQLStore(sessionStoreConfig, this.dbConnection);
...

【讨论】:

这不会编译。我在const MySQLStore 行收到以下错误(翻译自德语):“无法调用类型 'typeof MySQLStore' 的值。您要包含 'new' 吗?”我找到了一个解决方案,但我感觉它使用了旧语法:const expressMySqlSession = require("express-mysql-session")(expressSession);,然后是return new expressMySqlSession(sessionStoreConfig, this.dbConnection); 顺便说一句,我使用 Typescript 2.4.1 以防万一。 @TimoKunze 查看编辑,express-mysql-session 的导入不正确。上面的代码在“常规”JS 中工作。 现在 expressMySqlSession 的导入失败,“模块 '.../@types/express-mysql-session/index' 没有默认导出。”

以上是关于如何在 Typescript 项目中使用 express-mysql-session?的主要内容,如果未能解决你的问题,请参考以下文章

在typescript项目中引入如何js依赖

如何在 TypeScript 3.0 中使用项目引用?

如何在 Typescript 项目中使用 express-mysql-session?

如何在带有 Typescript 项目的 React Native 中使用 AWS Amplify?

如何在带有 Typescript 的 React 项目中组织类型定义

如何在我的 Vuejs 项目中迁移 aws-amplify 以使用 Typescript?