Как обрабатывать маршрут маршрута angular2 в Nodejs?
Я работаю над приложением NodeJS с Angular2. В моем приложении у меня есть домашняя страница и страница поиска. Для домашней страницы у меня есть HTML-страница, которая будет отображаться для localhost:3000/, и от пользователя домашней страницы перейдите к поиску, то есть localhost:3000/ страница поиска, которую я обработал маршрутами angular2.
У меня нет страницы для страницы поиска, ее вид отрисовывается с помощью angular2. Но когда я напрямую нажимаю localhost:3000/search, так как у меня нет этой маршрутизации в моем приложении узла, это выдает ошибку.
Я не знаю, как справиться с этим в приложении узла?
3 ответа
Если вы введете localhost:3000/search
непосредственно в панели навигации браузера ваш браузер отправляет запрос "/search" на ваш сервер, который можно увидеть в консоли (убедитесь, что вы отметили кнопку "Preserve Log").
Navigated to http://localhost:3000/search
Если вы запускаете полностью статический сервер, это приводит к ошибке, поскольку страница поиска не существует на сервере. Используя экспресс, например, вы можете перехватить эти запросы и вернуть файл index.html. Запускается загрузчик angular2, и активируется маршрут /search, описанный в вашем @RouteConfig.
// example of express()
let app = express();
app.use(express.static(static_dir));
// Additional web services goes here
...
// 404 catch
app.all('*', (req: any, res: any) => {
console.log(`[TRACE] Server 404 request: ${req.originalUrl}`);
res.status(200).sendFile(index_file);
});
Вам нужно использовать HashLocationStrategy
import { LocationStrategy, HashLocationStrategy } from "angular2/router";
bootstrap(AppComponent, [
ROUTER_PROVIDERS,
provide(LocationStrategy, { useClass: HashLocationStrategy })
]);
В вашем файле начальной загрузки.
Если вы хотите использовать PathLocationStrategy (без #), вы должны настроить стратегию перезаписи для своего сервера.
Я долго копался в этой теме и пробовал много методов, которые не работают. Если вы используете angular-cli и express, я нашел решение, если выбранный вами ответ не работает.
Попробуйте этот модуль узла: https://www.npmjs.com/package/express-history-api-fallback
[Angular] Измените файл app.module.ts в разделе @NgModule > import следующим образом:
RouterModule.forRoot(routes), ...
Это так называемая "Стратегия размещения"
Вы, вероятно, использовали "Стратегию определения местоположения хэша" следующим образом:
RouterModule.forRoot(routes, { useHash: true }) , ...
[Express & Node] По сути, вы должны правильно обрабатывать URL, поэтому, если вы хотите вызвать "api/datas" и т. Д., Что не противоречит стратегии расположения HTML5.
В вашем файле server.js (если вы использовали экспресс-генератор, для ясности я переименовал его в middleware.js)
Шаг 1. - Требуется http://the%20express-history-api-fallback.
const fallback = require('express-history-api-fallback');
Шаг 2. У вас может быть много модулей маршрутов, что-н. лайк:
app.use('/api/users, userRoutes);
app.use('/api/books, bookRoutes); ......
app.use('/', index); // Where you render your Angular 4 (dist/index.html)
Обратите внимание на порядок, который вы пишете, в моем случае я вызываю модуль прямо под app.use ('/', index);
app.use(fallback(__dirname + '/dist/index.html'));
* Убедитесь, что это раньше, где вы обрабатываете 404 или STH. как это.
Этот подход работает для меня:) Я использую стек EAN (Angular4 с cli, Express, Node)