【问题标题】:Node.JS equivelant to getContextPath, getServletPath?Node.JS 等价于 getContextPath、getServletPath?
【发布时间】: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


【解决方案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 具有内置的这种功能,并且是一种普遍接受的解决方案,除了您可以随意滚动之外。

【讨论】:

    猜你喜欢
    • 2013-01-06
    • 2013-01-11
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2014-04-14
    • 1970-01-01
    相关资源
    最近更新 更多