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 });