2012-03-19 27 views
1

我试图建立一个Web应用程序,其中:使用连接的NodeJS的静态服务器中间件只服务于一个子目录

http://mydomain.com/static/x.png供应x.png作为一个静态文件中使用Connect的静态中间件 http://mydomain.com/other_stuff做其他的东西

我的目录结构是

start_server.coffee 
static/ 
    x.png 

在start_server.coffee我:

app = connect() 
app.use connect.staticCache() 
app.use connect.static(__dirname + '/static') 

app.use ...middleware that serves the dynamic parts of my app... 

app.listen 80 

当我尝试http://mydomain.com/static/x.png时,请求绕过静态服务器并被路由到我的应用程序的其余部分。我在调试器中遍历代码,它看起来像静态试图查找static/static/x.png而不是static/x.png。

我能得到它通过改变工作connect.static(_ 目录名称+“/静态”),以connect.static( _dirname),但现在它将成为东西,这不是在静态目录这是不好!

什么是最干净的做我想做的事情?我大概可以使用Express的路由功能,但除非必须使用Express,否则我并不特别想使用Express,因为我的应用程序的其余部分以自己的方式处理路由。

谢谢!

回答

2

所以问题是你的URL路径和你的文件系统布局不匹配。有2个简单易上手的解决方案。

  1. 从您的网址中移除“static /”。静态中间件只会提供static目录下的文件,但URL不会包含“静态”一词。
  2. 执行此操作:mkdir public && mv static public。将public目录保留为空,而不是static子目录。现在您的网址可以保持不变,在您的代码中您需要app.use connect.static(__dirname + '/public')

现在,这是静态中间件提供的开箱即用功能。 URL必须简单映射到文件系统。这就是为什么它“起作用”并且很简单。

如果你真的想在static/您的网址,但不会映射到一个目录中的静态根目录下,它改变req.path删除前导“/静”,然后调用next()和静态中间件前添加一个中间件我认为这会欺骗静态中间件去做你想做的事。

+0

谢谢!我想我会去#2 ... – josh 2012-03-20 13:21:53