2017-08-28 9 views
0

私はミドルウェア機能を使って、ログインしたユーザーが要求されたページへのアクセスを許可する前にロール= 2を持っているかどうかをチェックする必要があります。ユーザーがロール= 2を持っていない場合は、ホームページ(/)にリダイレクトする必要があります。私はそれを達成するために次の関数を書いた:node.js |確実に管理するミドルウェアの機能が動作しない

isAdmin = function(req, res, callback) { 
    let Users = require('./models/users'); 
    Users.findOne({ 'steam.id': req.user.steam.id }, 'role', function(err, data) { 
     if(err) { 
      return callback(err, false); 
     } else { 
      if(data.steam.role === undefined || data.steam.role != 2) { 
       return callback(null, false); 
      } else { 
       if(data.steam.role === 2){ 
        return callback(null, true); 
       } 
      } 
     } 
    }); 
}; 

次の関数がapp.getに置かれます(/管理者)私のルートの一部app.get

function ensureAdmin(req, res, next) { 

    if (isAdmin()) { 
     return next(); 
    } 
    console.log(colors.red('[ATTENTION] ') + colors.red('A non admin tried to access admin-only pages')); 
    res.redirect('/'); 
} 

ファイル:

app.get('/admin', ensureAuthenticated, ensureAdmin, function(req, res){ 
    res.send('Admin panel!'); 
}); 

私は/ adminページにアクセスしようとすると、ReferenceError:isAdminが定義されていません。おそらく、私が解決できないこのエラーの後にはさらに多くのエラーがあるので、もし誰かが私が何をやったのか教えてくれればいいだろう。

module.exports = function(isAdmin){ 
    var isAdmin = function(req, res, callback) { 

     if(req.user.steam.role === undefined || req.user.steam.role != 2){ 
      return callback(null, false); 
     } else { 
      if(req.user.steam.role === 2){ 
       return callback(null, true); 
      } 
     } 

    }; 
} 

:私は

EDIT(新コード):) Node.jsの初心者です。あなたが別のファイルであり、それはまた

var isAdmin = function(req, res, callback) { let Users = require('./models/users'); return Users.findOne({ 'steam.id': req.user.steam.id }, 'role', function(err, data) { if(err) { return callback(err, false); } else { if(data.steam.role === undefined || data.steam.role != 2) { return callback(null, false); } else { if(data.steam.role === 2){ return callback(null, true); } } } }); }; export default isAdmin 

非同期

だとして、その機能を返却する場合

let isAdmin = require('../functions/isAdmin'); 
function ensureAdmin(req, res, next) { 

    if(isAdmin()) { 
     return next(); 
    } 

} 
+2

isAdminはあなただけで呼び出すことができません非同期である '場合(isAdmin()){}'すでにユーザーがリクエストオブジェクトにロードされている場合は、なぜあなたは、データベース内の自分の役割を確認する必要があります –

+0

?あなたはreq.user.steam.roleをチェックできませんか? – Paul

+0

ありがとうポール、私はあなたのアドバイスを実装しました:) – DerJP

答えて

1

あなたの関数のisAdminに輸出を行い、呼び出しがthenableにする必要があり

function ensureAdmin(req, res, next) { 

isAdmin().then(response => { 
    next(); 
}); 

} 

私はあなたがミドルウェアでnext()を呼び出した後に意味をなさないconsole.log res.redirectを書いたことに気付きました。 console.log()next()コールの前にシフトすることができます。あなたはそれが実装されているファイルからisAdmin機能をexportする必要がありますが@hansmaad

+0

ありがとうございました。私はPaulのコメントを考慮してdbクエリを削除しました。私のコードは今はもう必要ないと思う?オリジナルの投稿を編集したコードで編集しました。すべてが問題ないかどうか見ていただけますか?何とか私は役割= 2があっても私のホームページにリダイレクトされます。 – DerJP

+0

私はそれを見つけ出しました、ありがとう:) – DerJP

+0

それはポールからの素晴らしい入力でした。急いで行方不明になりました。乾杯! – kushalvm

1

フリストにより同様に述べたように、ファイルのインポートを行っていると仮定すると、ミドルウェア

最終でres.redirect()を避ける

export default isAdmin 
あなたは

const isAdmin = require('../middlewares/isAdmin'); // wherever you've put this file 

としてそれを使用したいファイルに

、その後requireそれをあなたのisAdmin関数は非同期で約束を返します。この約束が解決されたらnext()に電話をしなければなりません。

isAdmin().then(() => next(),() => res.redirect('/')); 
+0

ありがとうhansmaad :) – DerJP

関連する問題