How to handle angular2 route path in Nodejs?

前端 未结 3 1130
粉色の甜心
粉色の甜心 2020-12-06 05:22

I am working on a NodeJS app with Angular2. In my app, I have a home page and search page. For home page I have an HTML page that will render for the localhost:3000/

相关标签:
3条回答
  • 2020-12-06 05:44

    You need to use HashLocationStrategy

    import { LocationStrategy, HashLocationStrategy } from "angular2/router";
    bootstrap(AppComponent, [
     ROUTER_PROVIDERS,
     provide(LocationStrategy, { useClass: HashLocationStrategy })
    ]);
    

    In your bootstrap file.

    If you want to go with PathLocationStrategy ( without # ) you must setup rewrite strategy for your server.

    0 讨论(0)
  • 2020-12-06 05:54

    I've been digging this topic for quite a time , and try a lot of method that don' work . If you are using angular-cli and with express , I found a solution if the chosen answer doesn't works for you .

    Try this node module : express-history-api-fallback

    [ Angular ] Change your app.module.ts file , under @NgModule > imports as following :

    RouterModule.forRoot(routes), ...
    

    This is so called : " Location Strategy "

    You probably were using " Hash Location Strategy " like this :

    RouterModule.forRoot(routes, { useHash: true }) , ...
    

    [ Express & Node ] Basically you have to handle the URL properly , so if you want call "api/datas" etc. that doesn't conflict with the HTML5 Location Strategy .

    In your server.js file ( if you used express generator , I've rename it as middleware.js for clarity )

    Step 1. - Require the express-history-api-fallback module.

    const fallback = require('express-history-api-fallback');
    

    Step 2 . You may have a lot of routes module , sth. like :

    app.use('/api/users, userRoutes);
    app.use('/api/books, bookRoutes); ......
    app.use('/', index); // Where you render your Angular 4 (dist/index.html) 
    

    Becareful with the order you are writing , in my case I call the module right under app.use('/',index);

    app.use(fallback(__dirname + '/dist/index.html'));
    

    * Make sure it is before where you handle 404 or sth. like that .

    This approach works for me : ) I am using EAN stack (Angular4 with cli , Express , Node )

    0 讨论(0)
  • 2020-12-06 06:00

    If you enter localhost:3000/search directly in the browser navigation bar, your browser issues an request to '/search' to your server, which can be seen in the console (make sure you check the 'Preserve Log' button).

    Navigated to http://localhost:3000/search
    

    If you run a fully static server, this generates an error, as the search page does not exist on the server. Using express, for example, you can catch these requests and returns the index.html file. The angular2 bootstrap kicks-in, and the /search route described in your @RouteConfig is activated.

    // 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);
    });
    
    0 讨论(0)
提交回复
热议问题