首页 > 解决方案 > Angular 9 SSR ReferenceError:stripe.elements 未定义

问题描述

对于我的项目 Angular 9,我必须安装服务器端渲染 (SSR),我遵循官方教程https://angular.io/guide/universal。一开始我的问题是没有定义窗口。所以我决定用 domino 安装 SSR,并按照本教程在此处输入链接描述,但是当程序构建我的项目时出现问题:未定义元素。(const elements = stripe.elements()无法读取属性elements of undefined)。

在我的 server.ts 代码下面

import 'zone.js/dist/zone-node';

import { ngExpressEngine } from '@nguniversal/express-engine';
import * as express from 'express';
import { join } from 'path';


import { APP_BASE_HREF } from '@angular/common';
import { existsSync } from 'fs';


import * as core from 'express-serve-static-core';

const domino = require('domino');
const fs = require('fs');
const path = require('path');

// Use the browser index.html as template for the mock window
const template = fs
  .readFileSync(path.join(join(process.cwd(), 'dist/captn-boat-angular/browser'), 'index.html'))
  .toString();

// Shim for the global window and document objects.
const window = domino.createWindow(template);
global['window'] = window;
global['document'] = window.document;
global ['navigator']=window.navigator;
global ['screen']=window.screen;
global['Event'] = null;
global['window'] = window;
global['document'] = window.document;
global['branch'] = null;
global['object'] = window.object;
global['localStorage'] = window.localStorage;

global['navigator'] = window.navigator ;
global['elements']=window.elements;
global['elements']=null;
global['Event'] = null;
global['KeyboardEvent'] = null;
global['stripe']=window.stripe;

window.screen = { deviceXDPI: 0, logicalXDPI: 0 };
global['MouseEvent'] = window.MouseEvent;

declare interface Window {
  Stripe: any; // Or you can define a type for that in this file as well
  stripe:null;
  elements:null;
}

import { AppServerModule } from './src/main.server';
// The Express app is exported so that it can be used by serverless Functions.
export function app(): core.Express {
  const server = express();
  const distFolder = join(process.cwd(), 'dist/captn-boat-angular/browser');
  const indexHtml = existsSync(join(distFolder, 'index.original.html')) ? 'index.original.html' : 'index';



  // Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
  server.engine('html', ngExpressEngine({
    bootstrap: AppServerModule,
  }));

  server.set('view engine', 'html');
  server.set('views', distFolder);

  // Example Express Rest API endpoints
  // server.get('/api/**', (req, res) => { });
  // Serve static files from /browser
  server.get('*.*', express.static(distFolder, {
    maxAge: '1y'
  }));

  // All regular routes use the Universal engine
  server.get('*', (req, res) => {
    res.render(indexHtml, { req, providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }] });
  });

  return server;
}

function run() {
  const port = process.env.PORT || 4000;

  // Start up the Node server
  const server = app();
  server.listen(port, () => {
    console.log(`Node Express server listening on http://localhost:${port}`);
  });
}

// Webpack will replace 'require' with '__webpack_require__'
// '__non_webpack_require__' is a proxy to Node 'require'
// The below code is to ensure that the server is run only when not requiring the bundle.
declare const __non_webpack_require__: NodeRequire;
const mainModule = __non_webpack_require__.main;
const moduleFilename = mainModule && mainModule.filename || '';
if (moduleFilename === __filename || moduleFilename.includes('iisnode')) {
  run();
}

export * from './src/main.server';

然后是错误:未定义的元素

在此处输入图像描述

谢谢您的回答。

标签: javascriptserver-side-renderingangular9stripes

解决方案


您是否在应用程序的每个地方都使用了条带?我会在相关模块的支付部分使用它,并将其连接到延迟加载。因此,您可以使用 stripe 的进口商之一?像这里:ngx-stripe安装


推荐阅读