代码之家  ›  专栏  ›  技术社区  ›  Pini Cheyni

带api内部express调用的angular universal

  •  0
  • Pini Cheyni  · 技术社区  · 7 年前

    我已经检查了几个教程和演练,关于如何将SSR(服务器端渲染)添加到现有的角CLI和Express项目中。

    我可以用SSR运行node,但无法进行API调用。 我希望运行一个节点进程,该进程可以通过访问 橄榄石 数据库使用 捏合 是的。

    这是我的 服务器.js 文件

    // These are important and needed before anything else
    import 'zone.js/dist/zone-node';
    import 'reflect-metadata';
    
    import { enableProdMode } from '@angular/core';
    
    import * as express from 'express';
    import { join } from 'path';
    
    // Faster server renders w/ Prod mode (dev mode never needed)
    enableProdMode();
    
    // Express server
    const app = express();
    
    const PORT = process.env.PORT || 3000;
    const DIST_FOLDER = join(process.cwd(), 'bin/dist');
    
    // * NOTE :: leave this as require() since this file is built Dynamically from webpack
    const { AppServerModuleNgFactory, LAZY_MODULE_MAP } = require('./bin/dist/server/main');
    
    // Express Engine
    import { ngExpressEngine } from '@nguniversal/express-engine';
    // Import module map for lazy loading
    import { provideModuleMap } from '@nguniversal/module-map-ngfactory-loader';
    
    app.engine('html', ngExpressEngine({
      bootstrap: AppServerModuleNgFactory,
      providers: [
        provideModuleMap(LAZY_MODULE_MAP)
      ]
    }));
    
    app.set('view engine', 'html');
    app.set('views', join(DIST_FOLDER, ''));
    
    // import * as apiS from './server/index';
    // apiS.load(app);
    // TODO: implement data requests securely
    // app.get('/api/*', (req, res) => {
    //   res.status(404).send('data requests are not supported');
    // });
    
    import * as LoadRoutes from './server/boot/routes';
    LoadRoutes.load(app);
    
    
    // Server static files from /browser
    app.get('*.*', express.static(join(DIST_FOLDER, '')));
    
    // All regular routes use the Universal engine
    app.get('*', (req, res) => {
      res.render('index', { req });
    });
    
    // Start up the Node server
    app.listen(PORT, () => {
      console.log(`Node server listening on http://localhost:${PORT}`);
    });
    

    甚至可以从同一个节点进程完成SSR+API调用吗?如果可以,有人可以在这里发布答案吗?

    0 回复  |  直到 7 年前
        1
  •  0
  •   Ali Shahzad    6 年前

    已经在那儿了。只需取消这些行的注释,并使用express router扩展api路由:

    app.get('/api/*', (req, res) => {
      res.status(404).send('data requests are not supported');
    });
    

    改用路由器文件:

    app.use('/api/*', appRoutes);
    

    以api/开头的每个URL都将由后端api提供服务。

    推荐文章