未设置节点快速Cookie

时间:2018-11-16 15:28:47

标签: node.js typescript express

我最近将项目从普通的javascript切换到了打字稿。一切正常,因此除了会话处理外。

这是我到目前为止的项目设置:

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

和其他一些东西,但是对于这个问题应该不重要

MongoHandler.ts具有连接到mongo db并返回与mongoose.connection对象的诺言的功能。

与mongodb的连接正常。

内部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 :(得分:0)

app.use()不能在这样的异步调用函数内部有效地调用。结果是您以这种方式添加的中间件将被添加到中间件链的末尾,为时已晚(应该在路由之前)。

要使用常规的Mongoose连接,您可以致电.connect(),而不必等待回调/承诺。根据{{​​3}}:

// Basic usage
mongoose.connect(connectionOptions);

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

您需要重组MongoHandler代码,以便执行类似的操作。或者,使用async/await等待连接承诺被解析,然后继续其余方法,或在回调内部添加路由。