我最近将项目从普通的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版本的代码相同,效果很好。
答案 0 :(得分:0)
app.use()
不能在这样的异步调用函数内部有效地调用。结果是您以这种方式添加的中间件将被添加到中间件链的末尾,为时已晚(应该在路由之前)。
要使用常规的Mongoose连接,您可以致电.connect()
,而不必等待回调/承诺。根据{{3}}:
// Basic usage
mongoose.connect(connectionOptions);
app.use(session({
store: new MongoStore({ mongooseConnection: mongoose.connection })
}));
您需要重组MongoHandler
代码,以便执行类似的操作。或者,使用async/await
等待连接承诺被解析,然后继续其余方法,或在回调内部添加路由。