Bhu*_*kar 1 loopbackjs angular-loopback angular
我已经使用生成了一个LoopBack项目和Angular4项目angular-cli.我的LoopBack项目在端口提供html文件,3000我的Angular4项目正在服务于4200.
现在我需要知道我是否可以在3000上提供这个角度应用,就像从LoopBack目录提供静态文件一样?
我想问的是,是否有可能使用LoopBack服务器来提供Angular4应用程序就像它服务Angularjs应用程序一样?
谢谢
Jan*_*pan 12
如果使用ng-serve使用angular-cli,Angular仅在端口4200上运行.
您必须将angular的middleware.json文件选项指向angular2应用程序的dist目录,或将dist目录内容复制到loopback"client"文件夹中.
所以它看起来像这样:
middleware.json
.
.
"files": {
"loopback#static": {
"params": "$!../client/"
}
}
.
.
Run Code Online (Sandbox Code Playgroud)
该DIST目录是当您运行角度输出文件
ng build
Run Code Online (Sandbox Code Playgroud)
确保loopback boot文件夹中没有router.js文件.这通常包含一些路由代码,用于将根URL重定向到api的状态输出,因此/将带您进入api状态而不是角度应用程序的index.html.
Loopback服务于角度应用程序,但是,当你尝试直接访问链接时,例如/ blog /:id,换句话说就像/ blog/f24382f3y23f9832那样它会失败,因为loopback不知道如何处理这些链接,即使环回当直接查询这些链接时,客户端指向angular,angular尚未"bootstrapped".
要解决此问题,您必须添加自定义中间件以将环回重定向到角度索引,以便angular的路由器可以从那里获取它.
因此,在您的middleware.json文件中,更改以下内容:
"final": {
"./middleware/custom404": {}
}
Run Code Online (Sandbox Code Playgroud)
然后在/ server/middleware /中添加一个文件custom404.js,以便完整路径为/server/middleware/custom404.js.如果中间件目录不存在,请创建它.
然后在custom404.js文件中:
'use strict';
module.exports = function () {
var path = require('path');
return function urlNotFound(req, res, next) {
let angular_index = path.resolve('client/index.html');
res.sendFile(angular_index, function (err) {
if (err) {
console.error(err);
res.status(err.status).end();
}
});
};
};
Run Code Online (Sandbox Code Playgroud)
这将重定向回您的角度应用程序,角度的路由器将正确路由网址,同时仍然由环回服务.
我使用path.resolve这样的链接首先根据我们的网络路径解决,而不是当前目录,否则它将被视为恶意电话,您将收到403错误.
我已经阅读了angular.io文档,这是实现它的正确方法.请参见angular.io docs.阅读标题为"路由的应用必须回退到index.html"的部分
我在这里做了一个帖子从环回到angular2重写请求(拒绝执行脚本,因为它的MIME类型('text/html')不可执行)我遇到了类似的问题.