express 라우터가 호출 될 때마다 함수를 실행하고 싶습니다.렌더링하기 전에 함수를 실행하십시오. express get router NodeJS
나는 단순히 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의 file`
감사 adminlayout0.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')
동일합니다.
나는 그에게 내'sabsetting을()'업데이트 : 기능 sabSettings (REQ, 고해상도, 다음) { Setting.findOne (기능 (ERR, 설정) { 경우 (ERR) 을 console.log를 ('sabSetting 함수가 실행되었습니다.'); console.log (설정); console.log ('~~~~~~~~~~~~~~~~~~'); req.setting = 설정; next(); } ; }; 하지만 여전히 '정의되지 않은 속성'로고 '를 읽을 수 없습니다'라는 오류가 표시됩니다. 질문에 .pug 뷰를 추가했습니다. –
방금 질문을 업데이트했습니다. route.js'sabsetting()'에 추가로 놓친 것이 있습니까? –
@AnimeshSingh -'setting' 변수를보고 원하는 'setting.logo' 속성이 있는지 확인 했습니까? 그리고'res.render()'를 호출 할 때'setting : setting '대신에'setting : req.setting'을 전달해야합니다. 왜냐하면'setting' 변수를 저장했기 때문입니다. – jfriend00