2017-02-22 1 views
0

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') 

동일합니다.

답변

1

sabSettings을 잘못 선언했습니다. 당신이 next라는 이름의 인수가 잘못된 위치에 있었다 때문에 당신이 그것을 호출하려고 할 때

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

, 그것은 작동하지이었다 : 당신의 선언은 다음과 같이해야한다, 그래서 미들웨어는 세 개의 인수를 전달됩니다.

나는 왜 당신이하려고하는지 알지 못합니다. return next(setting). 그러면 요청에 오류가 있음을 Express에 알립니다. 또한

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

, 당신이해서는 안 : 당신이 어딘가에 요청 처리기의 나머지 부분은 그것을 사용할 수있는 setting 값을 넣어하려는 경우, 당신은 아마도 req 객체 등에 넣어 싶어 미들웨어 기능 내부에 throw err. 간단히 말해서 아무 것도 유용하지 않고 요청이 끝나지 않을 것입니다. 대신 오류를 처리 할 때 처리해야합니다. 오류가 발생하면 미들웨어 내의 대체 전략으로 분기하거나 next(err) 또는 res.status(500).send(...) 중 하나를 사용하여 실패한 요청을 반환 할 수 있습니다.

그런 다음 res.render()이로 변경해야합니다 : 당신이 그것을 참조해야 할 곳은 그래서

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

setting 변수

이제 req 객체에 저장됩니다.

setting을 참조하는 모든 곳에서 변경하십시오. 언급 한 바와 같이

+0

나는 그에게 내'sabsetting을()'업데이트 : 기능 sabSettings (REQ, 고해상도, 다음) { Setting.findOne (기능 (ERR, 설정) { 경우 (ERR) 을 console.log를 ('sabSetting 함수가 실행되었습니다.'); console.log (설정); console.log ('~~~~~~~~~~~~~~~~~~'); req.setting = 설정; next(); } ; }; 하지만 여전히 '정의되지 않은 속성'로고 '를 읽을 수 없습니다'라는 오류가 표시됩니다. 질문에 .pug 뷰를 추가했습니다. –

+0

방금 ​​질문을 업데이트했습니다. route.js'sabsetting()'에 추가로 놓친 것이 있습니까? –

+0

@AnimeshSingh -'setting' 변수를보고 원하는 'setting.logo' 속성이 있는지 확인 했습니까? 그리고'res.render()'를 호출 할 때'setting : setting '대신에'setting : req.setting'을 전달해야합니다. 왜냐하면'setting' 변수를 저장했기 때문입니다. – jfriend00

관련 문제