【问题标题】:How do I access a session in another route or function in nodejs?如何在 nodejs 中访问另一个路由或函数中的会话?
【发布时间】:2021-06-26 13:47:25
【问题描述】:

我正在建立一个平台,教师可以在其中跟踪学生的进度。我是 nodeJS 的初学者。我正在尝试使用会话授权用户。我正在使用 mysql 作为数据库。

我尝试在 app.js 中启动会话并在 authcontroller 中导入应用程序,然后将登录信息保存为 true,但它返回此错误:'TypeError: Cannot set property 'loggedin' of undefined at Query.onResult (E: \freelance\weloveworksheets\controller\auth.js:50:38)'

工作目录: https://imgur.com/a/pIOoOrm

app.js

const express = require("express");
var createError = require('http-errors');
var cookieParser = require('cookie-parser');

const bodyParser = require("body-parser");
const ejs = require('ejs');
var flash = require('express-flash');
const studentRoutes =  require("./routes/student");
const homeRoutes =  require("./routes/home");
const authRoutes = require("./routes/auth");
const mysqlConnection = require('./database');
const ejsLint = require('ejs-lint');
const serveIndex = require('serve-index');
const expressLayouts = require('express-ejs-layouts');

var session = require('express-session');


const app = express();

app.use(cookieParser());

app.use( express.static( "public" ) );
app.use('/student', studentRoutes);
app.use('/', homeRoutes);
app.use('/auth',authRoutes);
app.use(express.json());
// SET VIEW ENGINE
app.use(expressLayouts);
app.set('view engine', 'ejs');
app.set('views','views');

app.use(flash());


app.use(session({ 
  secret: '123456cat',
  resave: false,
  saveUninitialized: true,
  cookie: { maxAge: 60000 }
}));

// USE BODY-PARSER MIDDLEWARE
app.use(bodyParser.urlencoded({extended:false}));

app.listen('3000',()=>{
    console.log("server started on port 3000");
});

module.exports = app;

auth.js(路由器)


const express = require ('express');
const router = express();

const mysqlConnection = require("../database");
var session = require('express-session');
const ejs = require('ejs');
router.use( express.static( "public" ) );
const authController = require("../controller/auth");
const bodyParser = require("body-parser");



router.use(bodyParser.urlencoded({extended:false}));


router.post('/register',authController.register);

router.post('/login',authController.login);

module.exports = router;

auth.js(控制器)


const mysqlConnection = require("../database");
var express = require('express');
var router = express.Router();
const bcrypt = require('bcryptjs');
const session = require("express-session");
const app = require('../app');
exports.register = (req,res)=> {
        console.log(req.body);
        
        const {name,email,password,confirmPassword} = req.body;
        console.log(name);
        mysqlConnection.query('SELECT email FROM teachers WHERE email = ?',[email], async (err,results)=>{
            if(err) throw err;
            if(results.length>0){
                return res.render('register',{
                    message: 'That email is already in use'
                });

            }
            else if(password !== confirmPassword){
                return res.render('register',{
                    message: 'Passwords do not match'
                });
            }
            
            let hashedPassword = await bcrypt.hash(password, 8);
            

            mysqlConnection.query('INSERT INTO teachers SET ?',{name:name,email:email,password:hashedPassword},(err,results)=>{
                if(err) throw err;
                else{
                    res.redirect('/login');
                }
            });
        })
       
}
exports.login = (req,res)=> {
    
    console.log(req.body);
    const {email,password} = req.body;
    mysqlConnection.query('SELECT * FROM teachers WHERE email=?',[email],async(err,results)=>{
        if(!results || !(await bcrypt.compare(password,results[0].password))){
            res.render('login',{
                message:'E-mail or password is incorrect'
            })
        }
        else{                  
                req.session.loggedin = true;
                req.session.user = results;
                var sess = req.session;
                res.redirect('/student');
        }
        
    })
}

exports.authorize = (req,res)=>{
    
    console.log(req.session);
}

如果我从 auth.js 控制器启动会话,它工作正常,但我不知道如何访问会话以授权进一步的路由。抱歉,如果这很愚蠢,我是初学者,我尝试在线搜索,但找不到或不明白如何实现它。谢谢你的时间:)

我发现了一个类似的问题,但建议的答案不起作用 nodeJS + Express-Session error: Cannot set property 'loggedin' of undefined`

【问题讨论】:

    标签: mysql node.js express


    【解决方案1】:

    你可以在 app.js 中尝试这样的事情

    ...
    ...
    
    const auth = require('path_to_auth.js') // Require the auth.js file here
    app.use('/auth', auth) // all request to /auth will now go to auth.js
    ...
    
    
    // Now in a route
    app.get('/', checkSession, (req, res) => {
        // Everything here will execute only if session exists.
        // so now send your request to /auth like below    
        req.redirect('/auth')
        // Then at your auth you will be able to use req.session
    })
    
    
    // Middleware to check session validity
    function checkSession(req, res, next) {
        if (if_ssesion_exist) {// If session exists call next..
            next()
        }
        else {
            //create a session and redirect to '/'         
        }
    
    }
    

    【讨论】:

    • 我已经在 app.js 的 authroute 常量中要求并存储了 auth 路由。但我不明白如何检查会话是否存在于 checkSession 函数中
    • 在您的 auth.js 文件中,您需要在变量 app 中使用 app.js,但它并未在代码中的任何地方使用。
    猜你喜欢
    • 2017-03-16
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    相关资源
    最近更新 更多