如何避免Express.js

时间:2017-04-11 09:02:56

标签: javascript node.js express

我有三个文件server.js, views.jsaccess.js

server.js我已将所有dependencies和一些routes添加为

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

views.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
})


}

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 addaccess, removeaccess etc.

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


}

server.js文件中,我需要以下列方式access.js and views.js

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

当我尝试POST使用/services/user/abcd/addaccess我的views.js文件代码被执行时。 constants, query, rules是其他.js文件,已使用server.jsrequire('./filename')中使用。

我理解由于相同的网址结构导致歧义。我正在使用Express 4和Node JS 6.我想将access.jsviews.js的代码与server.js分开,并将它们放在单独的文件中,并以上述方式要求它们。 views.jsaccess.js由我创建。它们不是任何Javascript Framework或类似的东西。

view.js我也尝试过以下代码

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

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

但存在同样的问题。有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:0)

我建议你在Express中使用“miniApp”概念,其中每个“miniApp”都使用名称空间来区分。

例如: 主要应用:

带有'/ views / ...'前缀的所有路由都将转到viewsCtrl。此中间件应出现在默认/主应用程序路由之前:

 var viewsCtrl = require('./views');
 app.use('/views', viewsCtrl);

Inside views.js:

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。

答案 1 :(得分:0)

路线是相同的,快递将永远无法分辨哪一个。订单不是问题;正如Chris G在评论中所说,对app.post(...)的第二次调用将覆盖第一次(将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