Nodejs和Expressjs在现场打印会话

你好,我正试图做一个简单的login系统没有(密码)在nodejs和expressjs,使用会话。 我的问题是,当我尝试在下一页打印日志的名字时,它就出来了。

loginhtml:

<form method="post"> <label for="">UserName:</label> <input type="text" name="username" placeholder="Enter username" > <input type="Submit" value="Submit"> </form> 

main.html中:

 <h3> Welcome: <%= user %> </h3> 

index.js:

  var express = require('express'); var jokes = require('../model/jokes'); var session = require("express-session") var router = express.Router(); /* GET home page. */ router.get('/', function(req, res) { res.render('main', { title: 'Express', user: session.loggedin }); }) router.get('/login',function(req,res){ res.render('login'); }) router.get('/joke', function(req,res){ res.render('randomJoke',{ jokesObj : jokes.getRandomJoke()}); }) router.get('/allJokes', function(req,res){ res.render('Jokes',{ jokesObj1: jokes.allJokes}); }) router.get('/addNewJoke', function(req,res){ res.render('addJokes'); }) router.post('/storeJoke', function(req,res){ var funJoke = req.body; var jsonJoke = JSON.stringify(funJoke); jokes.addJoke(jsonJoke); res.redirect('/addNewJoke'); }) module.exports = router; 

app.js

 var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var session = require("express-session"); var routes = require('./routes/index'); var users = require('./routes/users'); var app = express(); app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); // uncomment after placing your favicon in /public //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use(session({secret:'secret_3162735',saveUninitialized:true, resave: true})); app.use('/', routes); app.use('/users', users); app.use(function (req,res,next) { var usernameLogged = req.session.loggedin; var inputName = req.body.username; if(usernameLogged){ return next();. }else if(inputName){ usernameLogged = inputName; session.userName = req.body.username; return res.redirect("/"); }else{ req.url = "/login"; return next(); } }); // error handlers // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // development error handler // will print stacktrace if (app.get('env') === 'development') { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); }); } // production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} }); }); module.exports = app; 

所以在main.html我不能用户,我试图打印会话(usernameLogged)出我的main.html不起作用。

就我所见,看起来就像使用中间件一样,它并不是真正被使用的。 Express中的中间件通常用于为请求的每个(或一个子部分)执行操作,例如logging日志,设置自定义标题等,您可以从文档中阅读有关Express-Middleware的更多信息。

您需要有一个路由来响应POST请求(您的login表单应该发送):

首先,你的login模板需要发送表单input到/login像这样:

 <form method="post" action="/login"> <label for="">UserName:</label> <input type="text" name="username" placeholder="Enter username" > <input type="Submit" value="Submit"> </form> 

为了显示表单,你有一个像这样的路线来简单地呈现login模板:

 router.get('/login', function(req, res) { // Show the login form res.render('login'); }) 

最后,你应该有一个path来接受来自表单的用户input。 当表单发送POST请求时,您需要使用router.post

 router.post('/login', function(req, res) { if (req.session.loggedin) { // User is already logged in, send them to the main page return res.redirect('/') } else if (req.body.username) { // User is not logged in, set the username for the user's session req.session.userName = req.body.username; // Then redirect to the main page return res.redirect('/') } else { // No username was entered res.send('Please enter a username') } }) 

最后,

然后,您应该安全地删除app.js文件的中间件( app.use部分)。

编辑:

用户正确地发现问题(和答案)是使用session而不是使用req.session – 会话是指express-session模块,而req.session是指用户的会话。

所以你的'/'路线应该是这样的:

 res.render('main', { title: 'Express', user: req.session.loggedin }); 

如果你想显示用户是否login。

或者,您可以执行以下操作来显示当前用户的用户名。

 res.render('main', { title: 'Express', user: req.session.userName });