Экспресс-сеанс не работает с 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.info("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, ...) и вместо этого запускаю localhost с помощью команды firebase serve в интерфейсе командной строки, сеансы не сохраняются.

Я также пробовал работать в производственной среде через 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 }
}));
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
0
3 224
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы используете хостинг firebase, вы также можете использовать коннектор, который соединяет ваш экспресс-сеанс с firebase.

Вы можете попробовать промежуточное ПО подключение-сеанс-firebase, которое интегрирует хранилище базы данных firebase с текущим экспресс-сеансом. Это может решить вашу проблему с сохранением сеанса.

Обновлено:

Если вы используете хостинг firebase и облачные функции, вы можете установить только файл 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 }
}));

Для получения дополнительной информации:

Я использовал это. Магазина действительно не хватало. Теперь я могу видеть, что сеансы сохраняются в базе данных Firebase, но все же каждый раз, когда я обновляю страницу, создается новый сеанс. Кажется, браузер не может сопоставить cookie и создает новый сеанс. Как решить эту проблему?

rgoncalv 04.07.2018 16:44

@rgoncalv откройте для этого запрос об ошибке на github и свяжите его со своим ответом.

li x 04.07.2018 19:57

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

И я заметил, что вы используете Express, поэтому вы можете проверить использование ниже:

выражать

ПРИМЕЧАНИЕ: в Express 4 экспресс-сессия должна быть передана в функцию connect-session-firebase exports, чтобы расширить экспресс-сессию.

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
  }));

И вы также можете действительно рассмотреть Безопасность, предоставляемый этой зависимостью

If you use a publicly available Firebase Database, please set proper rules:

{
  "rules": {
    ".read": "false",
    ".write": "false",
    "sessions": {
      ".read": "false",
      ".write": "false"
    },
    "some_public_data": {
      ".read": "true",
      ".write": "auth !== null"
    }
  }
}

Вы можете узнать больше о Правила Firebase и подключение-сеанс-firebase

Я использовал это заранее, и он сохранял сеансы в базе данных реального времени. Хотя та же проблема. Однако в обоих случаях я не помещал учетные данные или URL-адрес базы данных в initializeApp(), потому что я всегда использовал все, что мне было нужно (хранилище, Firestore) с Admin SDK, просто нужно было вызвать initializeApp(). Я просто попытался сделать это, хотя следуя этому firebase.google.com/docs/admin/setup#add_firebase_to_your_ap‌ p, и я загрузил файл json, но он не может его распознать. Как следует форматировать path/to?

rgoncalv 04.07.2018 21:23

Не могли бы вы сделать образец кода (такой же простой, как подсчет просмотров страниц), чтобы посмотреть, сможете ли вы заставить его работать?

rgoncalv 04.07.2018 21:32

Другие вопросы по теме