我遇到了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);
答案 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请求执行此操作。