【问题标题】:What is the best way to conditionally serve static files in Express?在 Express 中有条件地提供静态文件的最佳方式是什么?
【发布时间】:2018-07-14 22:38:05
【问题描述】:

我正在构建一个包含两个独立部分的应用程序,在前端我将其构建为两个独立的 Angular 应用程序。我这样做是为了更好地划分对代码库的控制访问,而不是不必要地让一些团队成员访问他们不需要的代码。

所以有两个独立的应用程序,由同一个 NodeJS 服务器提供服务。提供的应用程序取决于用户是否登录。如果他们是访客用户,他们将获得一个版本的应用程序,如果他们是注册用户,他们将获得具有更多功能的特权版本的应用程序。

如何在 Express 中有条件/动态地提供静态文件,比如“如果 User1 是客人,则提供 Application A,否则提供 Application B”?

【问题讨论】:

  • 拥有不同的仓库
  • @Aravind 好的,所以它们是完全独立的项目。现在 Web 服务器如何为适当的应用程序提供服务?
  • 不同的端点。
  • @Aravind 那么它取决于用户知道去哪一个。我希望用户忘记。用户只需转到https://sparkcryptotools.com 并获取正确的应用程序。
  • @Skyler Ya 我认为这不适用于大型 Angular 应用程序,其中包含大量资产,如 jpg 等

标签: node.js angular express


【解决方案1】:

如果您说的只是一个文件(例如app-1.jsapp-2.js),那么您不需要express.static。您可以使用res.sendFile 在普通路由处理程序中处理请求,如下所示:

app.get('/get-app', function(req, res) {
  if (userIsLoggedIn()) {
    res.sendFile('/path-to-logged-in-app.js')
  } else {
    res.sendFile('/path-to-logged-out-app.js')
  }
})

更多关于res.sendFilehere

如果您想通过express.static 提供多个文件,您将需要两个express.static 中间件实例,以及在此之上的另一个中间件来根据用户的登录状态修改请求URL。可能类似于以下内容:

// Middleware function to modify the request url based on user's status
function checkUser(req, res, next) { 
 if (userIsLoggedIn()) {
    req.url = `/app-1/${req.url}`
  } else {
    req.url = `/app-2/${req.url}`
  }

  next()
}

// Set up the middleware stack
app.use(checkUser)
app.use('/app-1', express.static(path.join(__dirname, 'app-1')))
app.use('/app-2', express.static(path.join(__dirname, 'app-2')))

更多关于编写自己的中间件here。您可能还想在 checkUser 中添加一些逻辑,以仅在请求静态文件的 url 之前添加(例如,请求 url 到 /assets/foo.js 得到前置处理,但请求到 /api/some-api-function 没有)。

说了这么多,我对 Angular 不是很熟悉,但我建议研究其他方式来提供登录/注销的内容。我假设 Angular 中有一些组件或“视图”的概念,并且仅渲染“LoggedIn”或“LoggedOut”组件/视图与发送完全不同的“应用程序”可能要干净得多。

【讨论】:

  • 感谢您的有用提示。我认为这是一个不错的解决方案,但它需要我为其中一个应用程序拥有一个完全独立的端点(即我必须将一个放在 https://sparkcryptotools.com/ 和一个 https://sparkcryptotools.com/authed
  • 其实这里提出的方案更好,因为它直接用express重写了url。这样你仍然只有一个端点,并且没有 http 重定向导致额外的请求,两个应用程序都将由 yourdomain.com/get-app 提供服务,只有一个端点,这个解决方案的好处还在于它会忘记用户他实际上得到的应用程序
  • 我删除了我的答案以支持这个答案,因为它还满足了用户不知道重定向的附加要求
  • @CodyBugstein 在上面的示例中,没有单独的端点。无论如何,客户端总是使用相同的req.url 发出请求,并且您预先添加一个路径段以到达相应的应用程序目录。
猜你喜欢
  • 2013-01-12
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多