在Express中有条件地提供静态文件的最佳方法是什么?

时间:2018-02-05 05:31:14

标签: node.js angular express

我正在构建一个具有两个独立部分的应用程序,它在前端构建为两个单独的Angular应用程序。我这样做是为了让我可以更好地将控制权限分配给代码库,而不必让一些团队成员访问他们不需要的代码。

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

如何在Express中有条件地/动态地提供静态文件,以便说“如果 .logo { width: 30px; height: 30px; background: red; flex:0 0 auto; } 是来宾,则提供User1,否则提供Application A”?

1 个答案:

答案 0 :(得分:2)

如果只是一个文件,您正在谈论服务(例如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.sendFile here的更多信息。

如果您想通过express.static提供多个文件,则需要两个express.static中间件实例,另外还需要一个中间件来修改请求网址,具体取决于用户的登录状态。也许是下面的内容:

// 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(例如,/assets/foo.js的请求URL获得前置处理,但/api/some-api-function的请求不会。)

所有这些,我对Angular并不熟悉,但我建议调查其他方式来提供登录/注销的内容。我假设在Angular中有一些组件或“视图”的概念,并且只需渲染“LoggedIn”或“LoggedOut”组件/视图而不是发送一个完全不同的“app”可能要清晰得多。