5

我正在构建一个单页应用程序,使用 Express 作为后端,使用 AngularJS 作为前端,我遇到了一些缓存问题。

我没有使用快速视图,只使用express.static中间件提供文件。

我的静态文件位于public/apppublic/dist取决于环境(dist 具有缩小文件)。

app.use app.router
app.use express.static(cwd + '/public/' + publicFolder, maxAge: MAX_AGE)

当请求“/”时,app.router 验证用户是否登录,如果一切正常,则index.html通过express.static(我只是调用next()控制器)提供服务。如果用户未登录,它将被重定向到login.html

我的问题是,如果我设置 maxAge,我的index.html文件会被缓存,并且对 '/' 的第一个请求不会通过router. 即使我没有登录,我也可以进入应用程序。

如果我将 maxAge 设置为 0,问题就会消失,但我想缓存我的所有 *.js 和 *.css 文件。

解决此类问题的正确方法是什么?开始使用视图?不同express.static的挂载点?

4

1 回答 1

4

您始终可以定义单独的路线,而不必使用视图(尽管视图模板不是一个坏主意)。通过这种方式,您可以定义index.html只是应用特殊情况maxAge

只需确保将路由放在静态中间件之前。

如果您愿意,您甚至可以使用send,即static中间件在幕后使用的同一个静态服务器。就像是:

// install send from npm
var send = require("send");

app.get("/index.html", function (req, res) {
  send(req, "/index.html")
    .maxage(0)
    .root(__dirname + "/public")
    .pipe(res);
});

或者更底层的流方式,比如:

app.get("/index.html", function (req, res) {
  res.setHeader('Content-Type', 'text/html');
  res.setHeader('Cache-Control', 'public, max-age=0');

  // Note that you'd probably want to stat the file for `content-length`
  // as well.  This is just an example.

  var stream = fs.createReadStream(__dirname + '/public/index.html');
  stream.pipe(res);
});
于 2013-07-01T15:23:15.377 回答