2017-02-22 3 views
0

エクスプレス・ルータが呼び出されるたびに関数を実行したい。レンダリングする前に関数を実行するエクスプレス・ルータを取得する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が間違っていると宣言しました。あなたの宣言は次のようにする必要がありますので、ミドルウェアは、3つの引数が渡されます:あなたは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、RES、次){ Setting.findOne(関数(ERR、設定){ (ERR) はconsole.log場合を( 'sabSetting function executed'); console.log(設定); console.log( '~~~~~~~~~~~~~~~~'); req.setting =設定; next(); }) ; }; それでも、 'プロパティー'のロゴは未定義です。 'というエラーが表示されます。質問に.pugビューを追加しました。 –

+0

私は自分の質問を更新しましたが、route.js 'sabsetting()'にもっと不足しているものがありますか? –

+0

@AnimeshSingh - 'setting'変数を見て、それに希望の' setting.logo'プロパティがあるかどうかを確認しましたか?そして、 'res.render()'を呼び出すときに、 'setting:setting'の代わりに' setting:req.setting'を渡す必要があります。 – jfriend00

関連する問題