Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Express会话不适用于Firebase主机_Javascript_Firebase_Express_Firebase Hosting - Fatal编程技术网

Javascript Express会话不适用于Firebase主机

Javascript Express会话不适用于Firebase主机,javascript,firebase,express,firebase-hosting,Javascript,Firebase,Express,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.

当我有以下内容时,会话被持久化,页面统计访问次数

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!");
   }
});
但是,当我删除
app.listen(3000,…)
并通过CLI中的
firebase service
命令在
localhost
中运行时,会话不会持久化

我还尝试通过
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 }
}));

如果您使用的是firebase主机,您还可以使用一个连接器将您的express会话与firebase连接起来

您可以尝试将firebase数据库存储与当前express会话集成的中间件。这可能会解决您关于会话持久性的问题

更新:


如果您正在使用firebase主机和云功能,则只能设置名为
\u session
的cookie。您可能必须使用此名称在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 }
}));
有关更多信息:


    • 我会建议一些东西,而不是使用这个,我会建议你使用这个

      我注意到您正在使用Express,因此您可能需要检查以下用法:

      快车 注意:在Express 4中,必须将Express会话传递给函数connect session firebase exports,以便扩展Express-session.Store:

      const express = require('express');
      const session = require('express-session');
      const FirebaseStore = require('connect-session-firebase')(session);
      const firebase = require('firebase-admin');
      const ref = firebase.initializeApp({
        credential: firebase.credential.cert('path/to/serviceAccountCredentials.json'),
        databaseURL: 'https://databaseName.firebaseio.com'
      });
      
      express()
        .use(session({
          store: new FirebaseStore({
            database: ref.database()
          }),
          secret: 'keyboard cat'
          resave: true,
          saveUninitialized: true
        }));
      

      ,您可能还需要真正考虑依赖关系

      提供的<强>安全> /强>。 如果您使用公开可用的Firebase数据库,请设置适当的 规则:


      您可以阅读更多信息,我也使用过它。它确实缺少存储。我现在可以看到会话保存在Firebase数据库中,但每次我刷新页面时都会创建一个新会话。看来浏览器无法匹配cookie并创建一个新会话。如何解决此问题?@rgoncalv在上打开一个错误请求github,并将其链接到您的答案。我之前使用过它,它正在将会话保存到实时数据库。但问题相同。不过,在这两种情况下,我都没有将凭据或数据库URL放在
      initializeApp()
      中,因为我总是使用我需要的一切(存储、Firestore)只需调用
      initializeApp()
      ,就可以使用Admin SDK。我只是试着这样做,但我下载了json文件,但它似乎无法识别。应该如何格式化
      路径/to
      呢?你能试着制作一个示例代码(简单到计算页面浏览量),看看它是否可以工作吗?
      {
        "rules": {
          ".read": "false",
          ".write": "false",
          "sessions": {
            ".read": "false",
            ".write": "false"
          },
          "some_public_data": {
            ".read": "true",
            ".write": "auth !== null"
          }
        }
      }