【问题标题】:How to use static folder but also use routing in Express?如何在 Express 中使用静态文件夹同时使用路由?
【发布时间】:2015-06-03 03:22:37
【问题描述】:

我在 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);

【问题讨论】:

  • 您能否从浏览器的网络请求工具中检查该请求实际上是“GET /user”而不是“GET /user/index.html”。或者,如果您在服务器端有一个记录器,可以在控制台上显示请求日志

标签: node.js express routes


【解决方案1】:

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

如果您绝对必须支持静态文件的 /user 并且您的 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 请求执行此操作。

【讨论】:

  • 必须有一个简单的方法不是吗?除非您登录,否则所有网站都有某些区域是禁区。在我的情况下,我希望 /user 被阻止,除非用户经过身份验证。但即便如此,我希望所有cssjs 等都可以访问
猜你喜欢
  • 1970-01-01
  • 2012-07-19
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 2011-05-08
相关资源
最近更新 更多