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

8

我正在尝试在一个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')的结果,这是一个你似乎遗漏的步骤。 - robertklep
嗯,是的,你说得对,但在ES6语法中,这个调用会是什么样子呢?以下几行代码应该是等价的,对吧? import * as expressSession from "express-session"; import expressSession = require("express-session"); 第一个是较新的ES6语法。但我该如何在ES6语法中编写require("xyz")(someparameter)?此外,这真的能解决类型不匹配的问题吗? - Timo Kunze
虽然不太美观,但在 index.d.ts 的 MySQLStore 声明中添加以下内容可以解决它: 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; - Max
3个回答

5

试试这个:

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);
...

1
这段代码无法编译。在 const MySQLStore 这一行上,我收到了以下错误(从德语翻译):“无法调用类型为 'typeof MySQLStore' 的值。您想包括 'new' 吗?” 我找到了一个解决方案,但我感觉它使用了旧的语法: const expressMySqlSession = require("express-mysql-session")(expressSession);,然后跟着 return new expressMySqlSession(sessionStoreConfig, this.dbConnection);顺便说一下,我使用的是 Typescript 2.4.1,如果有影响的话。 - Timo Kunze
@TimoKunze 看一下修改,express-mysql-session 的导入是错误的。上面的代码在“常规”JS中可以工作。 - robertklep
2
现在使用“import expressMySqlSession”导入时会出现错误:“Module '.../@types/express-mysql-session/index' has no default export." - Timo Kunze

2

在依赖项中同时列出了express-session, express-mysql-session, 和 @types/express-mysql-session:

当前版本的类型(大约两年前)跟踪旧版的express-mysql-session,其中默认导出是类。幸运的是,这个旧版本的库有一些向后兼容性,因此您可以直接实例化它:

import MySQLSessionStore from "express-mysql-session";

const store = new MySQLSessionStore({...});

这个库将会为您处理导入express-session依赖项

代码永不欺骗!


忘记添加 @types/express-mysql-session 为我解决了一个问题。 - GHOST-34

0
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
}))

这段代码对我来说是有效的。但我不知道为什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接