【问题标题】:call middleware function in router在路由器中调用中间件函数
【发布时间】:2017-05-11 09:50:42
【问题描述】:

我正在使用 Mozilla’s client-sessions 在我的 express.js 应用程序上实施会话,我需要一些帮助。我的 router.js 中有我的 post 和 gest 请求,app.js 中有中间件,运行时出现此错误:

ReferenceError:requireLogin 未定义

//index.js(路由器)

var express = require('express')
  , router = express.Router()
  , user = require('../public/js/models/test.js');



router.get('/profile-header', requireLogin, function (req, res, html) {
  console.log(req.session);
  res.render('templates/profile-header.jade', { title: 'Default' })
});


router.get('/sign-in', function (req, res, html) {
  res.render('templates/sign-in.jade', { title: 'Sign In' })
});


router.get('/blog-home', requireLogin, function (req, res, html) {
  res.render('templates/blog-home.jade', { title: 'Blog' })
});


router.get('/logout', function(req, res) {
  req.session.reset();
  res.redirect('/');
});


router.post('/profile-header', function (req, res, html) {
  user.login(req.body,  function (e, o) {
    if (o) {
      //add session
      req.session.user = o;
      res.redirect('/profile-header');
    } else {
      res.render('templates/sign-in.jade', { error: 'Invalid email or password.' });
    }
  });
});

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 stylus = require('stylus');
var bcrypt = require('bcrypt');
var should = require('should');
var session = require('client-sessions');

var index = require('./routes/index');
var users = require('./routes/users');
var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
function requireLogin (req, res, next) {
  if (!req.user) {
    console.log("pd");
    res.redirect('/sign-in');
  } else {
    next();
  }
};


app.use(session({
  cookieName: 'session',
  secret: 'random_string_goes_here',
  duration: 30 * 60 * 1000,
  activeDuration: 5 * 60 * 1000,
}));

app.use(logger('dev'));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cookieParser());
app.use(stylus.middleware(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));
app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

app.use('/', index);
app.use('/users', users);


app.use(function(req, res, next) {
  if (req.session && req.session.user) {
     user.exist(req.session.username, function  (e, o) {
      if (user) {
        req.user = user;
        delete req.user.user_password; // delete the password from the session
        req.session.user = user;  //refresh the session value
        console.log(req.session);
        res.locals.user = user;
      }
      // finishing processing the middleware and run the route
      next();
    });
  } else {
    next();
  }
});
// listener
app.listen(process.env.PORT || 3000, function () {
	console.log('Listening on http://localhost:' + (process.env.PORT || 3000))
})

module.exports = app;

感谢您的帮助!

【问题讨论】:

    标签: javascript node.js express couchdb middleware


    【解决方案1】:

    问题是requireLogin 是在app.js 中定义的,但在index.js 中却没有定义。 我建议将requireLogin 移动到外部服务中,并在需要时导入/需要它:

    // auth.service.js
    exports.requireLogin = function (req, res, next) { ... };
    

    然后在index.js 中添加:

    var Auth = require('./auth.service');
    
    ....
    
    router.get('/profile-header', Auth.requireLogin, function (req, res, html) {
      console.log(req.session);
      res.render('templates/profile-header.jade', { title: 'Default' })
    });
    

    【讨论】:

    • 好吧,我不需要在 app.js 中调用它吗?它唯一正常工作的时候是函数和所有get / post都在app.js中
    • 正如我从您的代码中看到的,您不会在 app.js 中调用它。它只是在那里宣布的。因此,如果您将其移至外部服务,您可以将其从 app.js 中删除。
    • 好的,我仍然遇到问题,当我注册时,我的请求正常并且我得到了我的用户信息,但随后它被 requireLogin 重定向到登录页面(如果登录成功),我不知道为什么..非常感谢帮助我!
    • 如果没有用户附加到req 对象,它会重定向。可能你登录后不加userreq
    • 有一个条件if (user)。也许它找不到用户,因此不要将其添加到req
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2019-07-05
    • 2021-03-05
    • 1970-01-01
    • 2019-01-09
    相关资源
    最近更新 更多