Docker容器内的Angular路由(AuthGuard)

vyswwuz2  于 2023-06-05  发布在  Docker
关注(0)|答案(1)|浏览(182)

我刚刚在Docker容器中部署了我的Angular项目。我访问该网站的路径是:localhost:4200,因为在我的机器上监听的是4200,但在容器内部监听的是端口80。我使用的是Angular routing,文件如下:

const routes: Routes = [
  { path: 'Login', component: LandingPageComponent},
  { path: '', component: AppComponent},
  { path: 'Home', component: BlogHomeComponent, canActivate:[AuthGuard],
  children:[
    { path: '', component: BlogHomeComponent},
    { path: "Posts", component: PostsComponent},
    { path: 'NewPost', component: CreatePostComponent},
    { path: 'Post/:id', component: SinglePostComponent}
]}
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

这是我的AuthGuard:

@Injectable({
  providedIn: 'root'
})
export class AuthGuard  {


constructor(private authService: AuthService, private route: Router){}

  canActivate():boolean {
    if(this.authService.isLoggedIn() == true){
      return true;
    } else {
      this.route.navigateByUrl("");
      return false;
    }
  }
}

它应该检查每次我试图访问路由,如果我登录。当我从consolde(没有docker)运行应用程序时,它工作得很好。每次我试图访问一个路径,它检查我是否登录,当我没有它直接把我扔到登录页面。但是当我在docker容器中部署应用程序时,这并不起作用。当我转到一个不允许我访问的页面时,我在浏览器中得到这个错误:x1c 0d1x为什么?如果我从angular cli(使用ng服务器)运行它时转到完全相同的链接(localhost:4200/Home/Posts),如果我没有登录,它实际上会将我推回登录。
编辑
下面是Angular项目的Dockerfile:

FROM node:latest as node
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build --prod

FROM nginx:alpine
COPY --from=node /app/dist/front-end-blog-demo /usr/share/nginx/html

这里是Docker-compose文件,因为我在后端和前端都运行docker-compose:

version: "3.8"
services:
  frontend:
    build: ./FrontEnd-BlogDemo
    ports:
      - 4200:80
  backend:
    build: ./BackEnd-BlogDemo
    ports:
      - 8080:80
jv4diomz

jv4diomz1#

您必须正确设置您的Web服务器。如果找不到页面,则Web服务器应返回index.html。它永远不会抛出404
你没有提供关于你的Docker-Image的信息,所以我只能让你参考这个页面https://angular.io/guide/deployment#server-configuration

编辑

是的,nginx是你的Web服务器。你需要一个配置文件,这样nginx就不会返回404
这是我的一个项目,上面有一个nginx。我为你标出了重要的一行。
https://github.com/AndreKoepke/home-system/blob/master/frontend/nginx/conf.d/default.conf#L39
你也可以看看我的dockerfile,看看如何把配置到nginx。
最后一个小提示:你在dockerfile中使用了npm install。您应该使用npm ci

相关问题