您好我正在尝试在nodejs和expressjs中使用会话在没有(密码)的情况下进行简单的登录系统。我的问题是,当我尝试将日志名称打印到下一页时,它会出来。
登录html:
<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我不能用户,我试图在我的main.html打印会话(usernameLogged)不起作用。
答案 0 :(得分:0)
据我所知,看起来您使用中间件的方式并不是真的应该使用它。 Express中的中间件通常用于对每个(或子部分)请求执行操作,例如日志记录,设置自定义标头等,您可以从documentation了解有关Express-middleware的更多信息。
您需要有一条路由来响应POST请求(您的登录表单应该发送):
首先,您的login
模板需要将表单输入发送到/login
,如下所示:
<form method="post" action="/login">
<label for="">UserName:</label>
<input type="text" name="username" placeholder="Enter username" >
<input type="Submit" value="Submit">
</form>
要显示表单,您可以使用这样的路径来简单地呈现登录模板:
router.get('/login', function(req, res) {
// Show the login form
res.render('login');
})
最后,您应该有一个接受表单中用户输入的路由。当表单发送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
- 会话指的是快递会话模块,而req.session
指的是用户&#39} ;会议。
因此,您的'/'
路线应如下所示:
res.render('main', { title: 'Express', user: req.session.loggedin });
如果要显示用户是否已登录。
或者您可以执行以下操作来显示当前用户的用户名。
res.render('main', { title: 'Express', user: req.session.userName });