我希望使用NodeJS服务器作为临时解决方案,以测试在.NET环境(我在Mac上)中构建的一些AngularJS应用程序。两个应用程序都使用<base>
标记,而web.config具有重写规则,以避免刷新404等。
我发现了一种可能的方法here,但是,我无法更新示例以包含多个规则。
dir结构我正在尝试测试看起来像这样:
|-- global (both apps use assets located inside of global)
|-- apps
|-- myApp1
|-- myApp2
应用程序本身使用 相对于所有资产的根 路径。所以,例如:
myApp1:
/global/images/image.jpg
/apps/myApp1/images/image.jpg
/apps/myApp1/css/styles.css
/apps/myApp1/js/scripts.js
web.config :
中描述了以下规则 <rule name="AngularJS Route for myApp1" stopProcessing="true">
<match url="^myApp1/.*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="/apps/myApp1/default.aspx" />
</rule>
<rule name="AngularJS Route for myApp2" stopProcessing="true">
<match url="^myApp2/.*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="/apps/myApp2/default.aspx" />
</rule>
可以使用各自的 别名访问这两个应用:
mydomain.com/myApp1/
mydomain.com/myApp2/
所以,说到这一点,我正在尝试创建一个非常简单的nodejs服务器来模拟上面的内容,而不是寻找能够运行生产就绪服务器的东西。只要这个客户端发送给我测试的东西,我就可以随时启动。
我开始查看一些链接,例如above,但我很难通过以下代码了解如何使用多次重写:
server.js
const express = require('express');
const app = express();
app.use((req, res, next) => {
if (req.url === 'myApp1') {
//what do I do here?
//tell it to reference the orig path?
req.url = '/apps/myApp1/';
//or do I use the router approach that's discussed in my reference link above?
}
next();
});
app.use(express.static(__dirname + '/'));
app.listen(3000, () => {
console.log('Listening on port 3000')
});
似乎这个问题被问了很多,但是我还没有看到它应用于多次重写,同时还要记住这两个应用程序都来自的共享全局目录。以前任何人都不得不做这样的事情吗?
答案 0 :(得分:0)
想想我弄清楚了。这是我对将来看待这个问题的人的解决方案。不确定这是否是最好的方法,但它似乎对我有用:
const express = require('express');
const path = require('path');
const router = express.Router();
const app = express();
const static = router.use('/', express.static(__dirname + '/', { redirect: false }));
const app1 = router.get('/myApp1*', (req, res, next) => {
res.sendFile(path.resolve('apps/myApp1/index.html'));
});
const app2 = router.get('/myApp2*', (req, res, next) => {
res.sendFile(path.resolve('apps/myApp2/index.html'));
});
app.use(static, app1, app2);
app.listen(3000, () => {
console.log('Listening on port 3000');
});