【发布时间】:2015-05-02 09:15:22
【问题描述】:
我正在开发一个网络服务器,它将为同一域上的各种“网络应用程序”加载各种模块。
在下面的例子中,
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
}
问题是,接下来我将更新上下文路径,因此用户必须转到 /somethingelse 才能访问 cats.js,而不是 /cats
因此,cats.js 不应检查 /cats/add,而应查找 $CONTEXT/add。
将“上下文路径”和“路径信息”传递给cats.js 的好方法是什么?我正在考虑制作一些东西并将其添加到req 对象上,但这肯定是一个常见问题,并且有一个普遍接受的正确解决方案吗?
【问题讨论】:
-
考虑
express模块。它实现了可以安装在任意上下文路径的路由处理程序(连接样式中间件)的概念。最新版本 4 更进一步,允许像任何其他中间件一样安装复杂的路由器代码。 -
express不是我想在前端包含的东西,因为这会干扰我的“进程管理”和“http to stdio”模块。但是,我想保持一致。cats.js将如何用 express 编写,处理程序如何能够区分“上下文路径”和“路径信息”? -
不幸的是,express 需要回调到您的 http 服务器。不幸的是,您的要求已完全在模块中实现。对您而言,更多的是原始问题,在快速服务器中,本身没有上下文路径。 createServer 的回调处理所有请求。这与 J2EE 之类的框架有所不同,在 J2EE 框架中,容器根据 URL 前缀决定哪个 servlet 获取哪个请求。 tl; dr,您正在编写与该容器等效的内容。要么使用 express,要么做 express 做的事情:
-
我现在正在跟进。如果可能的话,我已准备好在我的服务器中包含 express 在我的设置下。 stackoverflow.com/questions/29090240/…
-
我看到 express 使用
req.baseUrl作为上下文路径。
标签: node.js http routing contextpath