我想在每次调用快速路由器时执行一个函数。
我知道我可以将函数简单地放在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
中工作正常感谢。
答案 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
处随处更改。