我正在构建一个具有两个独立部分的应用程序,它在前端构建为两个单独的Angular应用程序。我这样做是为了让我可以更好地将控制权限分配给代码库,而不必让一些团队成员访问他们不需要的代码。
因此,有两个独立的应用程序,由同一个NodeJS服务器提供。提供的应用程序取决于用户是否已登录。如果他们是访客用户,则他们会获得一个版本应用程序,如果他们是注册用户,则会获得具有更多功能的应用程序的特权版本。
如何在Express中有条件地/动态地提供静态文件,以便说“如果 .logo {
width: 30px;
height: 30px;
background: red;
flex:0 0 auto;
}
是来宾,则提供User1
,否则提供Application A
”?
答案 0 :(得分:2)
如果只是一个文件,您正在谈论服务(例如app-1.js
或app-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”可能要清晰得多。