如何在Express中创建全局会话变量

时间:2019-03-24 09:25:31

标签: node.js express session-state

我正在制作一个测验应用程序,我拥有这些全局变量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 :(得分:0)

您可以使用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){
        ...

要更新值,只需在您的函数中更新所需的resession值即可。喜欢: req.session.score = 4 要么 req.session.diffculty = 'hard'