Express 会话不适用于 Firebase 托管

rgo*_*alv 6 javascript express firebase firebase-hosting

当我有以下内容时,会话会持续存在并且页面会计算访问次数。

app.set('trust proxy', true)
// The documentation specifies '1' instead of 'true'

app.use(session({
   secret: 'my secret',
   proxy: true,
   resave: false,
   saveUninitialized: true,
   cookie: { secure: false }
}))

app.listen(3000, function(){
   console.log("Server is connected!");
});

app.get("/login", (req, res) => {
   if(req.session.page_views){
       req.session.page_views++;
       res.send("You visited this page " + req.session.page_views + " times");
   } else {
       req.session.page_views = 1;
       res.send("Welcome to this page for the first time!");
   }
});
Run Code Online (Sandbox Code Playgroud)

但是,当我删除app.listen(3000, ...)localhost通过firebase serveCLI 中的命令运行时,会话不会持久化。

我也尝试过在生产环境中运行,firebase deploy但同样,会话没有持久化。

我已经尝试了多种选择app.use(session({,我相信解决方案可能就在那里。

有什么建议吗?

更新

const express = require('express');
const session = require('express-session');
const FirestoreStore = require('firestore-store')(session);
const bodyParser = require('body-parser');

app.use(cookieParser('My secret'));
app.use(bodyParser.urlencoded({ extended: true }));

app.use(session({
    store: new FirestoreStore({
         database: firebase.firestore()
    }),
    secret: 'My secret',
    resave: true,
    saveUninitialized: true,
    cookie: {maxAge : 60000,
             secure: false,
             httpOnly: false }
}));
Run Code Online (Sandbox Code Playgroud)

Abh*_*ngh 1

如果您使用 Firebase 托管,您也可以使用连接器将 Express 会话与 Firebase 连接。

您可以尝试connect-session-firebase中间件,它将 Firebase 数据库存储与当前的 Express 会话集成。这可能会解决您有关会话持久性的问题。

更新:

如果您使用 firebase 托管和云功能,那么您只能设置一个名为 name 的 cookie __session。您可能必须使用此名称来在 Firebase 托管中保留会话。

app.use(session({
    store: new FirestoreStore({
         database: firebase.firestore()
    }),
    name: '__session',
    secret: 'My secret',
    resave: true,
    saveUninitialized: true,
    cookie: {maxAge : 60000,
             secure: false,
             httpOnly: false }
}));
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息: