Node.js 在呈现express get router节点之前执行函数
每次调用express router时,我都要执行一个函数 我知道我可以简单地将该函数放在Node.js 在呈现express get router节点之前执行函数,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,每次调用express router时,我都要执行一个函数 我知道我可以简单地将该函数放在app.get函数中,但我想多次调用同一个函数 这是我的router.js文件: var Setting = require('../models/setting'); module.exports = function(app, passport) { // ===================================== // HOME PAGE (with login links) ===
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(设置)
正在将所有数据返回到我的控制台,但我收到一个错误,说明:
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'/'
来说效果很好
*这是我的view/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中同样可以正常工作
谢谢。您已声明
sabSettings
错误。中间件传递了三个参数,因此您的声明应如下所示:
function sabSetting(req, res, next) {
// function logic here
}
由于您命名的next
参数的位置错误,因此当您试图调用它时,它不是一个函数
而且,我不知道您为什么要尝试执行返回下一步(设置)
。这将告诉Express您正在报告请求中的错误。如果您试图将设置
值放在其他请求处理程序可以使用的地方,那么您可能希望将其放在req
对象上,例如:
req.setting = setting; // put setting on the req object for other code to use
next(); // continue routing
此外,您不应该在中间件函数中执行抛出err
。这根本不会做任何有用的事情,您的请求可能永远不会完成。相反,您应该在收到错误时处理它。当出现错误时,您可以切换到中间件中的某个备用策略,也可以使用next(err)
或执行res.status(500).send(…)
返回失败的请求
然后需要将res.render()
更改为:
res.render('index', { title: 'eduBird | Reach the glory', setting: req.setting });
设置
变量现在存储在req
对象中,因此您需要在那里引用它
无论您在哪里引用
setting
我都会将我的sabsetting()
更新为前面提到的内容:函数sabSettings(req,res,next){setting.findOne(函数(err,setting){if(err)console.log('sabsetting函数已执行');console.log(设置);console.log('~~~~~~~~~~');req.setting=setting;next();});};但它仍然显示了一个错误,即“无法读取未定义的属性”logo“,我在问题中添加了我的.pug视图。我刚刚更新了我的问题,route.jssabsetting()
?@AnimeshSingh-您是否查看了设置变量并查看它是否具有所需的设置.logo
属性?调用res.render()
时,需要传递setting:req.setting
而不是setting:setting
,因为这是存储setting
变量的地方。是的,我应该添加setting:req.setting
。在将sabSettings
添加到app.get('/signup')
之后,我打开了抛出错误的signup
页面,这两个页面现在都工作正常。谢谢@jfriend00