如何在 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-session
、express-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 项目中使用 express-mysql-session?
如何在带有 Typescript 项目的 React Native 中使用 AWS Amplify?