Служите 404 статусу на угловых 5 - PullRequest
0 голосов
/ 29 июня 2018

У меня проблема, которая меня расстраивает.

Кажется, я не могу обслуживать статус 404 с угловой 5.

Предпринятые шаги:

В моем server.ts я импортировал

const { AppServerModuleNgFactory, LAZY_MODULE_MAP } = require(`./dist-server/main.${hash}.bundle`);
import { ngExpressEngine } from '@nguniversal/express-engine';
import { REQUEST, RESPONSE } from '@nguniversal/express-engine/tokens';

И добавлено

app.engine('html', (_, options, callback) =>
    ngExpressEngine({
        bootstrap: AppServerModuleNgFactory,
        providers: [
            provideModuleMap(LAZY_MODULE_MAP),
            {
                provide: REQUEST,
                useValue: options.req,
            },
            {
                provide: RESPONSE,
                useValue: options.req.res,
            },
        ]
    })(_, options, callback)
);

В моем фактическом не найденном компоненте,

import { Component, Inject, Injector, OnInit, PLATFORM_ID } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';
import { RESPONSE } from '@nguniversal/express-engine/tokens';
import { Response } from 'express';

@Component({
	selector: 'not-found',
	templateUrl: './not-found.component.html',
	styleUrls: ['./not-found.component.scss']
})

export class NotFoundComponent implements OnInit {
	constructor(
		@Inject(PLATFORM_ID) private platformId: Object,
		@Inject(Injector) private injector: Injector
	) {}

	ngOnInit() {
			const response = this.injector.get(RESPONSE) as Response;
			response.status(404);
		}
	}
}

Прежде всего, я не понимаю, почему я получаю эту ошибку: enter image description here

Я запускаю это на локальном хосте и слежу за этой реализацией: https://blog.thecodecampus.de/angular-universal-handle-404-set-status-codes/

В разделе комментариев нам сказано заменить @Optional () @Inject (RESPONSE) частный ответ: Response) на @Inject (Injector) частный инжектор: Injector.

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Объект Express Response предоставляется только тогда, когда ваш код выполняется на стороне сервера во время предварительного рендеринга, но не после того, как выполнение на стороне клиента вступает во владение. Следовательно, ошибка, которую вы получили в вашем bwoser (clident-side)

Вы можете напрямую добавить ответ в конструктор, если указать его как Optional

import {Optional} from '@angular/core';

constructor(@Inject(PLATFORM_ID) private platformId: Object, 
            @Inject(RESPONSE) private response: Response)
{
//Here response will be null on client side, and contain Express Response instance on server side
}

Или, если вы хотите использовать экземпляр Injector напрямую (не знаю, зачем вам это нужно, если только у вас нет проблемы с циклической зависимостью), вам нужно сделать это только на стороне клиента

import {isPlatformServer} from '@angular/common';

ngOnInit() 
{
        if(isPlatformServer(this.platformId))//Only executes server side
        {
            const response = this.injector.get(RESPONSE) as Response;
            response.status(404);
        }
}
0 голосов
/ 29 июня 2018

Моя страница не найдена в папке с маршрутами, поэтому она выглядит так

{ Path: '**', component: PageNotFoundComponent }

Это означает, что если вы нажмете, например, mysite.com/askgdcaksgdf, вам будет предоставлена ​​страница 404.

...