在渲染express get router NodeJS

时间:2017-02-22 06:45:59

标签: node.js mongodb express mongoose

我想在每次调用快速路由器时执行一个函数。

我知道我可以将函数简单地放在app.get函数中,但我想多次调用相同的函数。

这是我的router.js文件

var Setting = require('../models/setting');
module.exports = function(app, passport) {

// =====================================
// HOME PAGE (with login links) ========
// =====================================
app.get('/', function(req, res) {
    Setting.findOne(function(err, setting) {
        if (err)
            throw err;
        // console.log(setting);
        res.render('index', { title: 'eduBird | Reach the glory', setting: setting }); // load the index file
    });
});

// =====================================
// LOGIN ===============================
// =====================================
// show the login form
app.get('/login', sabSettings, function(req, res) {

    // render the page and pass in any flash data if it exists
    res.render('login', {
        message: req.flash('loginMessage'),
        errors: req.flash('error'),
        title: 'Login | eduBird',
        setting: setting
    });
});

// process the login form

app.post('/login', passport.authenticate('local-login', {
    successRedirect: '/profile',
    failureRedirect: '/login',
    failureFlash: true
}));

// =====================================
// SIGNUP ==============================
// =====================================
// show the signup form
app.get('/signup', function(req, res) {

    // render the page and pass in any flash data if it exists
    res.render('signup', {
        message: req.flash('signupMessage'),
        errors: req.flash('error'),
        title: 'Register | eduBird',
        setting: req.setting
    });
});

// process the signup form
app.post('/signup', passport.authenticate('local-signup', {
    successRedirect: '/profile',
    failureRedirect: '/signup',
    failureFlash: true
}));

// app.post('/signup', function(req, res) {
//     console.log(req);
// });

// =====================================
// PROFILE SECTION =====================
// =====================================
// we will want this protected so you have to be logged in to visit
// we will use route middleware to verify this (the isLoggedIn function)
app.get('/profile', isLoggedIn, sabSettings, function(req, res) {
    res.render('profile', {
        user: req.user, // get the user out of session and pass to template
        title: req.user.local.name + "'s profile | eduBird",
        setting: req.setting
    });
});

// =====================================
// LOGOUT ==============================
// =====================================
app.get('/logout', function(req, res) {
    req.logout();
    res.redirect('/');
});
};

// route middleware to make sure a user is logged in
function isLoggedIn(req, res, next) {

// if user is authenticated in the session, carry on 
if (req.isAuthenticated())
    return next();

  // if they aren't redirect them to the home page
   res.redirect('/login');
  };

function sabSettings(next) {
Setting.findOne(function(err, setting) {
    if (err)
        throw err;
    console.log('sabSetting function executed');
    console.log(setting);
    console.log('~~~~~~~~~~~');
    // return setting;
    return next(setting);
});
};

这里我使用了一个正常执行的isLoggedIn示例,但同样不能用于sabSettings(),这会将所有设置配置从数据库传递到我的/login/signup/profile和/或/所有路线。

console.log(setting)将所有数据都返回到我的控制台,但是我收到一条错误消息:

 throw er; // Unhandled 'error' event
  ^

 TypeError: next is not a function
  at C:\Users\animeshweb\Desktop\projects\eb-v2\routes\routes.js:106:16

你可以看到我在app.get('/')中嵌入了一个函数来获得相同的功能,但是我希望这个函数可以在任何我想要的地方执行,所以我想要一个单独的函数。

更新

我按要求更新我的routes.js:

function sabSettings(req, res, next) {
Setting.findOne(function(err, setting) {
    if (err)
        next(err);
    console.log('sabSetting function executed');
    console.log(setting);
    console.log('~~~~~~~~~~~');
    req.setting = setting;
    next();
});

};

我上面也Setting = require(myModelURL)route.get'/'工作正常。

*这是我的视图/ layout.pug文件`

link(rel='icon', type='image/png', href=setting.logo.logo16 sizes='16x16')
link(rel='icon', type='image/png', href=setting.logo.logo32 sizes='32x32')
link(rel='icon', type='image/png', href=setting.logo.logo128 sizes='128x128')

同样在adminlayout0.pug

中工作正常

感谢。

1 个答案:

答案 0 :(得分:1)

您已宣布sabSettings错误。中间件传递三个参数,因此您的声明应该是这样的:

function sabSetting(req, res, next) {
   // function logic here
}

由于您命名为next的参数位于错误位置,因此当您尝试调用它时,它不是函数。

而且,我不知道你为什么要做return next(setting)。这将告诉Express您在请求中报告错误。如果您尝试将setting值放在其他请求处理程序可以使用的位置,那么您可能希望将其放在req对象上,例如:

 req.setting = setting;    // put setting on the req object for other code to use
 next();                   // continue routing

此外,您不应该在中间件功能中执行throw err。这根本不会做任何有用的事情,你的请求可能永远不会完成。相反,你应该在得到它时处理错误。当您收到错误时,您可能会转到中间件中的某个备用策略,或者只是通过next(err)res.status(500).send(...)返回失败的请求。

然后,您需要将res.render()更改为:

res.render('index', { title: 'eduBird | Reach the glory', setting: req.setting }); 

setting变量现在存储在req对象上,因此您需要在其中引用它。

在您所指的setting处随处更改。