2017-04-11 9 views
-1

にルートのあいまいさを避けるために、どのように私は三つのファイルserver.js, views.jsserver.jsaccess.jsExpress.js

私が入れているを持っているすべてのdependenciesと私はのようなコードを持っているviews.js

app.post('/services/getallversions', (req, res) => { 
... 
// code to handle the req and send response 
}) 

のようないくつかのroutes私はコードのように、を持ってaccess.jsで以下、

module.exports = function(app, db, bodyParser, rules, constants, query) { 

app.post('/services/user/:user/:type', (req, res) => { 
// user can be 'abcd' 
// type can be addview, deleteview etc. 

... 
// do processing for the req and send res 
}) 


} 
module.exports = function(app, db, bodyParser, rules, constants, query) { 

app.post('/services/user/:user/:type', (req, res) => { 
// user can be 'abcd' 
// type can be addaccess, removeaccess etc. 

... 
// do processing for the req and send res 
}) 


} 

server.jsファイルでは、私は

var access = require('./access')(app, db, bodyParser, rules, constants, query) 
var views = require('./views')(app, db, bodyParser, rules, constants, query) 

私は/services/user/abcd/addaccessviews.jsファイルのコードを使用してPOSTしよう

が実行されます、次のように access.js and views.jsが必要です。 constants, query, rulesserver.jsで既に使用されている .jsファイルです。 require('./filename')を使用しています。

と同じURL構造が原因であいまいさが発生することをご理解ください。私はExpress 4とNode JS 6を使用しています。access.jsviews.jsのコードをserver.jsから分離して別々のファイルに入れて、上記の方法でそれらを必要とします。 views.jsaccess.jsは私によって作成されています。彼らはJavascriptフレームワークなんかそんなものじゃない。 view.js

私はまた、次のコード

var router = require('express').Router() 

router.post('/services/user/:user/:type', (req,res)=>{}) 

を試してみましたが、しかし、同じ問題が存在します。それを達成する方法はありますか?

+0

私はあなたがここで何を求めているかを理解するのに苦労しています。どのように 'views.js'や' access.js'コードを実行するかをサーバーが正確に知っていますか? URLは*全く同じ*です。あなたはこの問題を認識していますが、単純で簡単な別のURLを使用せずに解決することは不可能です。あなたが 'views.js' _after_他のファイルをインクルードすると' app.post() 'コールが' access.js'のものを上書きします。 –

答えて

0

エクスプレスで "miniApp"コンセプトを使用することをお勧めします。ここで、各 "miniApp"は名前空間を使用して区別されます。例えば

: 主なアプリケーション:と

すべてのルート '/ビュー/ ...' プレフィックスはviewsCtrlに行きます。本ミドルウェアは、デフォルト/メインアプリルートの前に表示される必要があります。

views.jsインサイド
var viewsCtrl = require('./views'); 
app.use('/views', viewsCtrl); 

var router = require('express').Router(); 
// complete route /views/services/user/:user/:type 
router.get('/services/user/:user/:type', function(req, res){...}); 
module.exports = router; 
access.jsのための同じ

+0

@ Aman Gupta:viewsCtrlコードを教えてください。私はコードを整理する方法を知りたいですか? – Anijit

+0

2番目の部分はviewsCtrlです。私はmainAppに必要な間に名前を変更しました。 –

+0

https://expressjs.com/en/api.html#app.use –

0

ルートは同一であり、expressは決してどちらを呼び出すかを判断できません。注文はここでは問題ではありません。 Chris Gがコメントで述べたように、app.post(...)への2回目の呼び出しは最初のものを上書きします(URLをハッシュセットのキーとみなします)。

あなたはすでにあなたがルーティングミドルウェアでその知識を置くことができるので、URLは、/addviewまたは/removaccessなどの形式になりますことを知っている:

// access.js 
app.post('/services/user/:user/access/:type', (req, res) => { 
    // ... type is now only add, remove, etc... 
}) 

// view.js 
app.post('/services/user/:user/view/:type', (req, res) => { 
    // ... 
}) 

、あるいは(と思う):

// access.js 
app.post('/services/user/:user/:type((access)$)/', (req, res) => { 
    // ... will match addaccess, removeaccess and so on 
    // but I'm not entirely sure ... 
}) 
ここ

参考:

https://expressjs.com/en/guide/routing.html