如何使用静态文件夹,还可以在Express中使用路由?

时间:2015-06-03 03:22:37

标签: node.js express routes

我遇到了Express in Express的主要问题。

在我的项目中,有一个文件夹/public

/folder内我还有其他一些文件夹,比如

- public
     |- user
     |- common

最初,我的Node.js服务器提供网页的唯一方法是通过res.sendFile(../..)。问题是.js文件和.css文件不知道去哪里。

所以我添加了

app.use('/', express.static(__dirname + '/public'));

但现在问题是,如果我尝试访问/user会发生什么,那个文件夹中的index.html文件的静态版本会被返回,而我的节点应用中定义的路由被忽略!

这条路线 - 最重要的是,auth中间件永远不会被触及!

如何协调从静态文件夹提供文件的需要,但是也可能有我想要更密切控制的同名路由?

app.use('/user', userauth, userRoutes);

1 个答案:

答案 0 :(得分:0)

假设/user是某种API,我不认为express.static旨在以这种方式使用。我认为最好的解决方案是使用不同的路线。您可以在所有路由的开头添加类似/ api /的内容,或者确保静态文件在/ css,/ js,/ partials等下组织。

如果您绝对必须支持/用户使用静态文件和api调用,则需要抛弃express.static并使用Accept头与自定义中间件之类的东西来确定浏览器的要求。根据情况,这可能会变得很复杂,无法支持所有变量。一个简单的例子是这样的:

app.use(function(req, res, next){ 
    // check Accept header to make sure its a JSON request
    if(req.accepts('application/json') && !req.accepts('html')) {

        // JSON request so forward request on to the next middleware(eventually hitting the route)
        return next();
    }

    // NOT a JSON request so lets serve up the file if it exists...

    // TODO use req.path to check if file exists - if not 404 - will also need to map paths 
    // to /users to check for /users/index.html if you need to support that
    var fileExists = false;

    return fileExists ? res.sendFile('...') || res.status(404).send('Not Found');
});

您必须确保客户端调用/users时将Accept标头设置为application/json。大多数客户端框架都可以为所有AJAX请求执行此操作。