如何在车把中访问app.locals变量

时间:2018-09-07 23:48:01

标签: javascript node.js express mongoose

app.js

var debug = require('debug');
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');
javvar mongoose = require('mongoose');
var session = require('express-session');
var db = require('./dbconn');

db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
  console.log('we are connected!');
});

var index = require('./routes/index');
var users =
  require('./routes/users');
var signup = require('./routes/signup');
var login = require('./routes/login');
var adreqform =
  require('./routes/adreqform') var dashboard =
    require('./routes/dashboard')

var app = express();

// view engine setup app.set('views', path.join(__dirname, 'views'));
app.engine('hbs', exphbs({
  extname: '.hbs',
  defaultLayout: 'layout'
}));
app.set('view engine', 'hbs');

// uncomment after placing your favicon in /public
//app.use(favicon(__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: 'gh jewellery',
  resave: true,
  saveUninitialized: false


}));
app.use(function(req, res, next) {

  app.locals.currentUser = req.session.user;
  next();
});

app.use('/', index);
app.use('/users', users);
app.use('/dashboard',
  dashboard);
app.use('/signup', signup);
app.use('/login', login);
app.use('/adreqform', adreqform);

// catch 404 and forward to error handler app.use(function (req, res,
next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handlers

// 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: {}
  });
});

app.set('port', process.env.PORT || 3000);

module.exports = app;

var server = app.listen(app.get('port'), function() {
  debug('Express server listening on port ' + server.address().port);
});

注意,我在上面分配了app.locals.currentUser = req.session.user;,并且当我的路线/ login被点击时,req.session.user被设置了,这是代码。

login.js

var express = require('express');
var router = express.Router();
var User = require('../models/user.model.js');
var app = require('../app'); 

/* GET signup page. */
router.get('/', function(req, res, next) {
  res.render('login');
});

router.post('/', function(req, res, next) {

  User.findOne({
    email: req.body.email
  }, function(err, user) {
    var logged = false;
    if (err) {
      console.log(err);
    } else if (!user) {

      res.render('login', {
        errnoacc: 'User does not exist! Please register.'
      })
    } else if (user && req.body.password == user.password) {

      req.session.user = user;
      res.render('dashboard');

    } else {
      res.render('login', {
        errpass: 'Password does not match. Please try again!'
      });
    }

  });

  next();

});

module.exports = router;

在上面的代码中,当执行POST时,我分配了req.session.user = user;(如果一切都很好),我渲染了仪表板视图,有一个layout.hbs,其中有导航栏,我想使用app.locals.currentUser来显示currentUser个对象。

在我的layouts.hbs {{currentUser.username}}中无法使用。

我是expressjs开发的新手,所以我知道我缺少一些东西。

1 个答案:

答案 0 :(得分:2)

app.locals保存所有应用程序的设置,如果您的应用程序有多个用户,它将覆盖信息。

app.use(function(req, res, next) {
  app.locals.currentUser = req.session.user;
  next();
});

您可以使用res.locals

app.use(function(req, res, next){
  res.locals.user = req.user;
  res.locals.authenticated = ! req.user.anonymous;
  next();
});

然后您可以在车把中进行访问,例如:

p #{user.userName}