Как создать глобальные переменные сеанса в экспрессе - PullRequest
1 голос
/ 24 марта 2019

Я делаю приложение для викторины, и у меня есть эти глобальные переменные x, оценка и сложность, из которых я использую x, чтобы получить вопрос из моей базы данных через серийный номер (sno). Все работало нормально, пока я не развернул приложение на heroku и не попросил своих друзей посетить его одновременно. Я полагал, что в узле несколько запросов не имеют разные значения переменных, но одинаковы. У меня вопрос, как мне определить их независимо для каждой сессии?

var express = require("express");
var app = express();
var mongoose = require("mongoose");
var bodyParser = require("body-parser")
var session = require('express-session');

const PORT = process.env.PORT || 3000;

var x = 1;
var score = 0;
var difficulty = "";

//APP CONFIG
mongoose.connect(MONGO_URI, {useNewUrlParser: true});
app.set("view engine", "ejs");
app.use(express.static("public"));
app.use(bodyParser.urlencoded({extended: true}));
app.use(session({secret: 'keyboard cat', saveUninitialized: true, resave: true, cookie: { secure: true }}));

//MODEL CONFIG
var questionSchema = new mongoose.Schema({
    difficulty: String,
    sno: Number,
    question: String,
    option1: String,
    option2: String,
    option3: String,
    option4: String,
    answer: String
});

var Question = mongoose.model("Question", questionSchema);

app.get("/", function(req, res){
    res.render("home")
})

app.post("/", function(req, res){
    difficulty = req.body.difficulty;
    res.redirect("/startQuiz")
})

app.get("/startQuiz", function(req, res){
    if(x>10){
        res.render("score", {score: score})
        x = 1;
        score = 0;
    } else{
        Question.findOne({difficulty: difficulty, sno: x}, function(err, question){
            if(err){
                console.log(err)
            } else {
                res.render("index", {question: question});
            }
        });
    }
});

app.post("/startQuiz", function(req, res) {
    Question.findOne({difficulty: difficulty, sno: x}, function(err,foundQuestion){
        if(err){
            console.log(err);
        } else{
            if(foundQuestion.answer === req.body.val){
                score++;
                x++;
                res.send("#7fce44")
            } else {
                x++;
                res.send("#e80909")
            }
        }
    })
});


app.listen(3000, () => {
    console.log(`Our app is running on port ${ PORT }`);
});

1 Ответ

0 голосов
/ 24 марта 2019

Вы можете использовать session для хранения переменных. И промежуточное программное обеспечение, чтобы установить его для каждого запроса.

// Run a "middleware" function on each request
app.use((req, res, next) => {
   // Check if we've already initialised a session
   if (!req.session.initialised) {
      // Initialise our variables on the session object (that's persisted across requests by the same user
      req.session.initialised = true;
      req.session.x = 1;
      req.session.score = 0;
      req.session.difficulty = '';
   }
   next();
});

В другом месте вы можете снова получить к ним доступ через сеанс.

pp.get("/startQuiz", function(req, res){
    if(req.session.x > 10){
        ...

Для обновления значений просто обновите желаемое значение req.session в вашей функции. Подобно: req.session.score = 4 или же req.session.diffculty = 'hard'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...