如何访问nodejs中另一个路由或函数中的会话



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

我尝试在app.js中启动会话,并在authcontroller中导入应用程序,然后将loggedin保存为true,但它返回了以下错误:"TypeError:无法在Query.onResult(E:\freestyle\weloveworkspaces\controller\auth.js:50:38(">

工作目录:https://i.stack.imgur.com/lfcLF.jpg

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会话错误:无法设置属性';loggedin';未定义`

您可以在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 '/'         
}
}

最新更新