как установить «connect-redis» в typescript

#typescript #express #redis #express-session

#typescript #экспресс #redis #экспресс-сессия

Вопрос:

Теперь я следую руководству по Fullstack React GraphQL TypeScript

У меня возникают проблемы с подключением через express-session;;;

 import connectRedis from "connect-redis";
import session from "express-session";

...

const RedisStore = connectRedis(session);
 

[ОШИБКА]

 error TS2345: Argument of type 'typeof session' is not assignable to parameter of type '(options?: SessionOptions | undefined) => RequestHandler<ParamsDictionary, any, any, ParsedQs, Record<string, any>>'.
Types of parameters 'options' and 'options' are incompatible.
Type 'import("/Users/jsyovo/Documents/2-MyRepository/2-ReactJS/14-reddit-clone/server/node_modules/@types/connect-redis/node_modules/@types/express-session/index").SessionOptions | undefined' is not assignable to type 'import("/Users/jsyovo/Documents/2-MyRepository/2-ReactJS/14-reddit-clone/server/node_modules/@types/express-session/index").SessionOptions | undefined'.
  Type 'import("/Users/jsyovo/Documents/2-MyRepository/2-ReactJS/14-reddit-clone/server/node_modules/@types/connect-redis/node_modules/@types/express-session/index").SessionOptions' is not assignable to type 'import("/Users/jsyovo/Documents/2-MyRepository/2-ReactJS/14-reddit-clone/server/node_modules/@types/express-session/index").SessionOptions'.
    Types of property 'store' are incompatible.
      Type 'Store | undefined' is not assignable to type 'Store | MemoryStore | undefined'.
        Type 'Store' is not assignable to type 'Store | MemoryStore | undefined'.
          Type 'import("/Users/jsyovo/Documents/2-MyRepository/2-ReactJS/14-reddit-clone/server/node_modules/@types/connect-redis/node_modules/@types/express-session/index").Store' is not assignable to type 'import("/Users/jsyovo/Documents/2-MyRepository/2-ReactJS/14-reddit-clone/server/node_modules/@types/express-session/index").Store'.
            Types of property 'load' are incompatible.
              Type '(sid: string, callback: (err: any, session?: SessionData | undefined) => any) => void' is not assignable to type '(sid: string, fn: (err: any, session?: SessionData | null | undefined) => any) => void'.
                Types of parameters 'callback' and 'fn' are incompatible.
                  Types of parameters 'session' and 'session' are incompatible.
                    Type 'SessionData | undefined' is not assignable to type 'SessionData | null | undefined'.
                      Type 'import("/Users/jsyovo/Documents/2-MyRepository/2-ReactJS/14-reddit-clone/server/node_modules/@types/connect-redis/node_modules/@types/express-session/index").SessionData' is not assignable to type 'Express.SessionData'.
                        The types of 'cookie.path' are incompatible between these types.
                          Type 'string | undefined' is not assignable to type 'string'.
                            Type 'undefined' is not assignable to type 'string'.

22     const RedisStore = connectRedis(session);
 

Ответ №1:

У меня была похожая проблема, но, как ни удивительно (и, честно говоря, не совсем уверен, почему это так, но в любом случае ..) сохранение «требовать» вместо преобразования в «импорт» решило эту проблему для меня. Когда я настроил redis точно так же, как документация из connect-redis, кажется, что он работает нормально, но каким-то образом преобразование в импорт создало проблемы. Если кто-нибудь может объяснить, почему это происходит, был бы очень признателен!

 const redis = require('redis')
const session = require('express-session')

let RedisStore = require('connect-redis')(session)
let redisClient = redis.createClient()

app.use(
  session({
    store: new RedisStore({ client: redisClient }),
    saveUninitialized: false,
    secret: 'keyboard cat',
    resave: false,
  })
)
 

К вашему сведению, вот мои версии пакетов (все последние версии обновлены):

 "connect-redis": "^6.0.0",
"express-session": "^1.17.2",
"redis": "^4.0.0",
"@types/connect-redis": "^0.0.17",
"@types/express-session": "^1.17.4",
"@types/redis": "^2.8.32",
 

Я столкнулся с этой проблемой, следуя руководству Ben Awad по Fullstack React GraphQL Typescript на YouTube, и когда я отменил преобразование импорта, код, казалось, работал хорошо, лол

Комментарии:

1. Это сработало и для меня! Я хотел бы знать «почему», если у кого-нибудь есть идея?

Ответ №2:

Попробуйте откатиться к

 "@types/express-session": "1.17.1"
"@types/connect-redis": "^0.0.14"
 

У меня похожие проблемы, и откат помогает, хотя я не думаю, что это хорошая практика. Я считаю, что что-то не так с вводом новых версий этих пакетов


Ну, я снова попытался использовать новейшие пакеты и снова удалить «dist» и «tsc -w». Такой ошибки нет. Так что не уверен, каков именно механизм.

Комментарии:

1. Спасибо, братан!!! Я меняю на старую версию, тогда она работает!!

2. Я считаю, что вы просто очищаете что-то вроде cache или dist, и это должно сработать.

3. Удаление пряжи. блокировка и переустановка deps помогли

4. warning @types/redis@4.0.11: This is a stub types definition. redis provides its own type definitions, so you do not need this installed. Это основная причина. Удалите @types/redis , эта проблема исчезнет.