Nodejs和Expressjs在现场打印会话

时间:2016-03-28 15:16:50

标签: node.js express

您好我正在尝试在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)不起作用。

1 个答案:

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