是否可以将所有url路径重定向到nodejs应用程序中App Engine中的根处理程序?

时间:2019-05-24 01:02:18

标签: node.js google-app-engine google-cloud-platform

我正在使用App Engine托管Nodejs SPA,我不需要路由,因此我想将所有处理程序重定向到根目录。示例:将domain.tld/nsa-secrets重定向到domain.tld

我已经尝试在documentation中将处理程序配置为示例,但是我总是得到默认的Apache html。

这是我的app.yaml

runtime: nodejs10
instance_class: F2

handlers:
- url: /
  static_files: dist/index.html
  upload: dist/index.html

- url: /
  static_dir: dist

- url: /.*
  secure: always
  redirect_http_response_code: 301
  script: auto

error_handlers:
- file: error.html

我看到一个错误,然后在错误报告中显示:

Error: Cannot find module '/srv/server.js'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:582:15)
    at Function.Module._load (internal/modules/cjs/loader.js:508:25)
    at Function.Module.runMain (internal/modules/cjs/loader.js:754:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)

我需要在server.js中手动实现url处理程序吗?

感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:0)

您会尝试Firebase Hosting吗?

Firebase托管比App Engine托管SPA更好。

请参阅:

  • https://firebase.google.com/docs/hosting/use-cases
      

    受益于Firebase Hosting的独特优化,该服务可为单页Web应用程序和静态网站提供服务。静态资产(HTML,CSS,JavaScript,字体等)的交付由我们的SSD后端存储和全球CDN提供支持,其CDN的位置遍布全球所有主要位置。您甚至可以将动态内容缓存在全局CDN上。 Firebase托管的所有网站也都获得免费的SSL证书,因此您的内容始终可以安全地传递。

  • https://firebase.google.com/docs/hosting/full-config#rewrites

答案 1 :(得分:0)

用于Firebase的Angular + Cloud功能+ Firebase托管+ NestJS方法。

  1. index.html重命名为index2.html。这对于渲染路径很重要,否则,除了根/以外,所有路径上的渲染效果都很好。
  2. 更新angular.json使其具有以下"index": "apps/myapp/src/index2.html",(将index.html更改为index2.html)。 注意:index.html的路径可能与您不同,我正在使用Nx工作区
  3. templatePath: join(BROWSER_DIR, 'index2.html'),添加到NestJS的ApplicationModule中,很可能是在服务器目录中将文件命名为 app.module.ts

像这样:

@Module({
  imports: [
    AngularUniversalModule.forRoot({
      bundle: require('./path/to/server/main'), // Bundle is created dynamically during build process.
      liveReload: true,
      templatePath: join(BROWSER_DIR, 'index2.html'),
      viewsPath: BROWSER_DIR
    })
  ]
})
  1. 初始化Firebase云功能和Firebase托管,有关如何设置的信息,请检查https://hackernoon.com/deploying-angular-universal-v6-with-firebase-c86381ddd445https://blog.angularindepth.com/angular-5-universal-firebase-4c85a7d00862

  2. 编辑您的 firebase.json

应该看起来像这样,或者至少是hosting部分。

{
  "hosting": {
    "ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
    "public": "functions/path/to/browser",
    "rewrites": [
      {
        "function": "angularUniversalFunction",
        "source": "**"
      }
    ]
  }
} 
  1. 在您的 main.ts 中,您需要在服务器上设置Cloud Functions。

在极简主义的情况下,它会像这样:

import * as admin from 'firebase-admin';
import * as functions from 'firebase-functions';

admin.initializeApp(); // Initialize Firebase SDK.
const expressApp: Express = express(); // Create Express instance.

// Create and init NestJS application based on Express instance.
(async () => {
  const nestApp = await NestFactory.create<NestExpressApplication>(
    ApplicationModule,
    new ExpressAdapter(expressApp)
  );
  nestApp.init();
})().catch(err => console.error(err));

// Firebase Cloud Function for Server Side Rendering (SSR).
exports.angularUniversalFunction = functions.https.onRequest(expressApp);

使用这种方法,您不必关心NestJS方面的路由。您可以在Angular端设置所有内容,仅此而已。 Angular负责路由。您可能已经注意到,这是服务器端渲染(SSR),但是可以结合使用用于Firebase的NestJS + Cloud Functions将所有路由重定向到index.html(或更准确地说是index2.html)。另外,您还可以免费获得SSR:)

展示项目:

1)Firebase的Angular + Angular Universal(SSR)+云功能:https://github.com/Ismaestro/angular8-example-app(缺少NestJS)。

2)Angular + NestJS:https://github.com/kamilmysliwiec/universal-nest(缺少Firebase的云功能)。