Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Angular Universal时,在组件的ngOnInit中发出http请求是否有问题?_Angular_Angular Universal_Http Proxy Middleware - Fatal编程技术网

使用Angular Universal时,在组件的ngOnInit中发出http请求是否有问题?

使用Angular Universal时,在组件的ngOnInit中发出http请求是否有问题?,angular,angular-universal,http-proxy-middleware,Angular,Angular Universal,Http Proxy Middleware,我一直在通过ng serve for development运行我的Angular应用程序,没有遇到任何错误。然而,当使用SSR时,每当我加载作为ngOnInit方法一部分发出http请求的组件时,我的服务器日志中就会出现错误。我的策略有什么问题吗 通过谷歌搜索我的错误,我没有找到任何有用的信息。我应该在页面完全加载之前等待以发出请求,还是使用其他方法?如果是的话,我会怎么做 我正在使用http代理中间件包向django服务器发送请求 这是当请求作为ngOnInit的一部分发出时出现的错误: E

我一直在通过ng serve for development运行我的Angular应用程序,没有遇到任何错误。然而,当使用SSR时,每当我加载作为ngOnInit方法一部分发出http请求的组件时,我的服务器日志中就会出现错误。我的策略有什么问题吗

通过谷歌搜索我的错误,我没有找到任何有用的信息。我应该在页面完全加载之前等待以发出请求,还是使用其他方法?如果是的话,我会怎么做

我正在使用http代理中间件包向django服务器发送请求

这是当请求作为ngOnInit的一部分发出时出现的错误:

ERROR Error
    at XMLHttpRequest.send (C:\{...}\dist\{...}\server\main.js:201490:19)
    at Observable.rxjs__WEBPACK_IMPORTED_MODULE_1__.Observable [as _subscribe] (C:\{...}\dist\{...}\server\main.js:23724:17)
    at Observable._trySubscribe (C:\{...}\dist\{...}\server\main.js:186583:25)
    at Observable.subscribe (C:\{...}\dist\{...}\server\main.js:186569:22)
    at scheduleTask (C:\{...}\dist\{...}\server\main.js:106745:32)
    at Observable.rxjs__WEBPACK_IMPORTED_MODULE_7__.Observable [as _subscribe] (C:\{...}\dist\{...}\server\main.js:106807:13)
    at Observable._trySubscribe (C:\{...}\dist\{...}\server\main.js:186583:25)
    at Observable.subscribe (C:\{...}\dist\{...}\server\main.js:186569:22)
    at subscribeToResult (C:\{...}\dist\{...}\server\main.js:196664:23)
    at MergeMapSubscriber._innerSub (C:\{...}\dist\{...}\server\main.js:191854:116)
以下是我的测试组件的相关部分:

export class TestComponent implements OnInit {
  output: String = "The server is not running or is not connected"

  constructor(private httpTestService: HttpTestService) { }

  ngOnInit(): void {
    this.testGetRequest();
  }

  testGetRequest() {
    this.httpTestService.testGetRequest().subscribe(temp => {
      this.output = temp.message; // response is json with a 'message' attribute
    });
  }

}
以下是我的HttpTestService的相关部分:

import { HttpClient } from '@angular/common/http';

即使在使用SSR运行时,应用程序也能正常运行,但我在服务器控制台中遇到的错误除外。

在进行HTTP调用时,您应该使用绝对URL

所以问题可能就在这里

testGetRequest(): Observable<any> {
  return this.http.get('/api/endpoint1');
}


希望能有所帮助

这对我来说很有效,但您答案中的文档链接已断开。我发现了类似的信息。哦,我的错。它应该只是一个官方文件的链接,我已经更新了。如果我的答案对你有效,请将其标记为正确答案。
import { createProxyMiddleware } from 'http-proxy-middleware';
export function app() {
  const server = express();
  const distFolder = join(process.cwd(), 'dist/.../browser');
  const indexHtml = existsSync(join(distFolder, 'index.original.html')) ? 'index.original.html' : 'index';

  server.engine('html', ngExpressEngine({
    bootstrap: AppServerModule,
  }));

  server.set('view engine', 'html');
  server.set('views', distFolder);

  // re-route requests to /api/ to the django REST api
  server.use('/api/**', createProxyMiddleware({ target: 'http://localhost:8000', changeOrigin: true }));
testGetRequest(): Observable<any> {
  return this.http.get('/api/endpoint1');
}

import { HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
import { Inject, Injectable, Optional } from '@angular/core';
import { REQUEST } from '@nguniversal/express-engine/tokens';
import { Request } from 'express';

@Injectable()
export class UniversalInterceptor implements HttpInterceptor {

  constructor(@Optional() @Inject(REQUEST) protected request: Request) {}

  intercept(req: HttpRequest<any>, next: HttpHandler) {
    let serverReq: HttpRequest<any> = req;
    if (this.request && req.url.indexOf('http') !== 0) {
      let newUrl = `${this.request.protocol}://${this.request.get('host')}`;
      if (!req.url.startsWith('/')) {
        newUrl += '/';
      }
      newUrl += req.url;
      serverReq = req.clone({url: newUrl});
    }

    return next.handle(serverReq);
  }
}
@NgModule({
  imports: [
    ...
  ],
  bootstrap: [AppComponent],
  providers: [
    {
      provide: HTTP_INTERCEPTORS,
      useClass: UniversalInterceptor,
      multi: true,
    },
  ],
})
export class AppServerModule {}