Узлы экспресс-куки не установлены - PullRequest
0 голосов
/ 16 ноября 2018

Я недавно переключил свой проект с обычного JavaScript на машинопись. Все работает нормально, за исключением обработки сеанса.

Пока это мой проект:

Server.ts
App.ts
/db/mongo/MongoHandler.ts

и некоторые другие вещи, но это не должно иметь значения для этой проблемы

MongoHandler.ts имеет функцию, которая подключается к базе данных mongo и возвращает обещание с объектом mongoose.connection.

Связь с mongodb работает нормально.

Inside App.ts:

class App {

    public app: express.Application;
    private routes: Routes;

    constructor() {
        this.app = express();
        this.config();
    }

    private config(): void {

        //define less middleware
        this.app.use(less(path.join(__dirname, 'public')));

        //define static directory
        this.app.use(express.static(path.join(__dirname, 'public')));

        //define favicon
        this.app.use(favicon(path.join(__dirname, 'public', 'images', 'favicon.ico')));

        //add support for POST messages and cookies
        this.app.use(express.json());
        this.app.use(express.urlencoded({extended: false}));
        this.app.use(cookieParser());

        //define view engine
        this.app.set('views', path.join(__dirname, 'views'));
        this.app.set('view engine', 'pug');

        //mongo connection

        //session handling

        //loading config
        this.app.set('config', new ConfigHandler());

        //setup sessions
        var expiryDate = new Date(Date.now() + 60 * 60 * 1000);
        const MongoStore = connectMongo(session);

        const mongoHandler = new MongoHandler();
        mongoHandler.connect(this.app).then(connection => {
            this.app.use(session({
                secret: 'supersecret',
                store: new MongoStore({mongooseConnection: connection}),
                resave: false,
                saveUninitialized: true,
                cookie: {
                    secure: false,
                    expires: expiryDate
                }
            }));
        });
        this.app.set('mongo', mongoHandler);

        //define routes
        this.routes = new Routes(this.app);
        this.routes.routes();
    }
}

export default new App().app;

Так что в основном каждый app.use работает, кроме сессионного материала. req.session не определяется при каждом запросе.

Я знаю, что что-то упустил, но не могу понять. Это тот же код, что и в старой версии javascript, который отлично работает.

1 Ответ

0 голосов
/ 16 ноября 2018

app.use() не может эффективно вызываться внутри асинхронно вызываемой функции, подобной этой. В результате промежуточное программное обеспечение, которое вы добавляете таким образом, будет добавлено в конец цепочки промежуточного программного обеспечения, что слишком поздно (оно должно предшествовать маршрутам).

Чтобы использовать обычное соединение с Mongoose, вы можете позвонить .connect(), но вам не нужно ждать обратного вызова / обещания. Согласно документации :

// Basic usage
mongoose.connect(connectionOptions);

app.use(session({
  store: new MongoStore({ mongooseConnection: mongoose.connection })
}));

Вам нужно реструктурировать свой код MongoHandler, чтобы вы могли сделать что-то подобное. Либо используйте async/await, чтобы дождаться разрешения соединения, прежде чем продолжить оставшуюся часть метода, или добавьте маршруты внутри обратного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...