我正在开发一个网络服务器,它将在同一个域上为各种“网络应用程序”加载各种模块。
在以下示例中,
createServer(function (req, res) { // crude request routing example
var path = url.parse(req.url).pathname
if(path.match(/^\/cats(?:\/|$)/))
require('./cats.js')(req, res)
else if(path.match(/^\/dogs(?:\/|$)/))
require('./dogs.js')(req, res)
else
require('./404.js')(req, res)
})
if语句检查匹配的上下文路径,并将其路由到适当的模块。
现在模块cats.js
看起来像这样:
module.exports = function (req, res) {
var path = url.parse(req.url).pathname
// HOW can I get context path and path info? What variables should I use?
if(req.path == '/cats/add') {
//....
} else if(req.path == '/cats/delete') {
//....
} else
// 404
}
问题在于,我将更新上下文路径,因此用户必须转到/cats
而不是/somethingelse
而不是cats.js
因此,cats.js
不应检查/cats/add
,而应查找$CONTEXT/add
。
将“上下文路径”和“路径信息”传递给cats.js
的好方法是什么?我正在考虑制作一些内容并将其添加到req
对象上,但这肯定是一个常见的问题,并且有一个普遍接受的正确解决方案?
答案 0 :(得分:1)
你可以cat.js
导出一个带有路径arg的函数,并使用它来动态创建请求处理程序:
module.exports = function(context){
return function (req, res) {
var path = url.parse(req.url).pathname
if(req.path == '/'+context+'/add') {
//....
}
//....
}
}
正如其他人所提到的,Express.JS内置了这种功能,并且是一种普遍接受的解决方案,除了您可以根据需要自由滚动。