【发布时间】: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`
【问题讨论】: