2016-11-08 4 views
1

私は新しくExpressです。Express Router.useミドルウェア

DB内の値に基づいてリクエストをルーティングしようとしています。これを行うには、私はサービス機能を呼び出すことです。 ルーティングは正常に動作していますが、要求オブジェクトが失われています。 reqをサービスに渡そうとしましたが、機能しませんでした。

これを行う方法を示す助けがあればいいですね。

ここは私のコードブロックです。

var companyService = require("services/companyService"); 
router.use('/', function (req, res, next) { 
companyService.isCompanyOnline(req.body.companyCode).then(function (company) { 
    if (company) { 
     router.use('/', require("api/controllers/online")); 
    } 
    else { 
     router.use('/', require("api/controllers/offline")); 
    } 
}); 
next(); 
}); 

module.exports = router; 

Services.companyService:

function isCompanyOnline(code) { 
var deferred = Q.defer(); 
companies.findOne({ companyCode: code }, function (err, company) { 
    if (err) deferred.reject(err.name + ': ' + err.message); 
    //if (err) throw err; 
    if (company) { 
     // return company online parameter 
     deferred.resolve(company.isOnline); 
    } else { 
     // company not found 
     deferred.resolve(); 
    } 
}); 
return deferred.promise; 
} 
+0

**:

まず、ルート定義:ルータのURLを変更すると

app.use('/api/online', require("api/controllers/online")); app.use('/api/offline', require("api/controllers/offline")); 

を'req'オブジェクトを失う?あるいは、 'req'オブジェクトにはどこにアクセスしようとしていますか? – tmslnz

+0

@tmslnzを 'api/controllers/online'または' api/controllers/online'ルートに追加します。 –

+0

さて、返信するには – tmslnz

答えて

1

あなたはどこにでもそれを渡していないので、あなたがリクエストオブジェクトを失っています。

3つのルートハンドラが同じパスに登録されています。/です。私が間違っていないならば、彼らはあなたがそれらを追加するすべての順序で呼ばれるでしょう。しかし、あなたの注文は、router.use()の電話をかけているifに依存します。予想外のことですが、期待通りに動作しない可能性があります。 登録されると、アプリケーションを再起動するまで、ミドルウェアスタックに残ります。

私はあなたがそれらが呼び出された順にを知って、それに応じてnext()を使うので、一箇所でのオフライン/オンラインのロジックを持っているか、一度にすべてのあなたのミドルウェアを登録するにはリファクタリング示唆しています。別のノートで

、あなたはrequire Dモジュールに引数を渡したい場合は、この操作を行います。

変更api/controllers/online及びその他、引数を受け入れ、あなたが渡しているハンドラ関数を返すようにします。

// your code in api/controllers/online and offline 

module.exports = function (req) { 
    // now you have req available in-scope here 
    function yourFunctionThatNeedsReq (req) { 
     // do stuff with req 
    } 
    return yourFunctionThatNeedsReq; 
}; 

そして、そのようなあなたのrequireを更新します。 …(req)に注意してください。

router.use('/', require("api/controllers/online")(req)); 
+0

ありがとうございました:) –

+0

最後のビットは機能しません。あなたは宣言時にまだ要求がないときに関数を呼び出しています。あなたが記述した効果を得るでしょう。 – Paul

+0

@Paulあなたが正しいと確信していません... 'require(...) 'が" factory "を返す場合、' factory(req) 'は工場が渡したリクエストオブジェクトを持つルートハンドラを返します。 - さらにOPのために働いたようです。 – tmslnz

0

マイソリューション:**あなたは

if (req.body.companyInfo.isOnline) { 
     req.url = '/online' + req.url + '/' + req.body.companyInfo.companyPath; 
     next(); 
    } 
    else { 
     req.url = '/offline' + req.url + '/' + req.body.companyInfo.companyPath; 
     next(); 
    } 
関連する問題