首页 > 其他分享 >关于服务器端渲染的 Web 应用的 504 错误问题

关于服务器端渲染的 Web 应用的 504 错误问题

时间:2023-02-18 20:44:55浏览次数:38  
标签:Web 服务器端 js 000 504 SSR block 请求

除非客户在 SSR 中添加了用于显式发送 504 的自定义逻辑,否则 504 不会来自 SSR。

在默认的 Spartacus/SSR 中,没有显式发送 504 的逻辑。 默认情况下它只发送 200 或 500(仅在 APP_INITIALIZER 失败的情况下)。

我们在浏览器里看到的这个 504 错误:

An error occurred.

Sorry, the page you are looking for is currently unavailable.

这个错误消息是由 nginx 生成的,并发送 504(网关超时),根据 MDN,这意味着:

504 Gateway Timeout 服务器错误响应代码表示服务器在充当网关或代理时,没有及时从上游服务器(the upstream server)获得完成请求所需的响应。

在这种情况下,上游服务器是 node.js 服务器。node.js 根本没有响应,于是 nginx 网关向客户端发回 504 错误码。

如果 Node.js 响应速度过慢,Nginx 就会直接将客户端发送过来的请求通过 504 错误码响应。

在某些特殊的场景下,有问题的请求在 Dynatrace 中实际上是不可见的。

个人的猜测是 Dynatrace 只有 在请求完成时才记录了该项目。所以那些永远不会完成的永远不会被 Dynatrace 记录。

例如,某些请求逻辑进入了无限循环(在 Java 代码中),导致线程从未结束,该请求从未记录在 Dynatrace 中。

下面这段代码可以模拟 Node.js 主线程被 block 的场景:

export class AppComponent {
  constructor(protected location: Location) {}

  ngOnInit() {
    const url = this.location.path();
    const shouldBlock = url.endsWith('?block-main-thread-super-long');
    console.log({ url, shouldBlock });
    if (shouldBlock) {
      this.blockMainThreadSuperLong();
    }
  }

  blockMainThreadSuperLong() {
    const SUPER_BIG_BUMER = 1_000_000_000_000_000;
    for (let i = 0; i < SUPER_BIG_BUMER; i++) {
      // do nothing, just looping to simulate a slow operation
    }
  }
}

运行命令行 curl http://localhost:4200/electronics-spa/?block-main-thread-super-long,不会收到任何响应,因为主线程被 block 住了。

再发送其他请求 curl http://localhost:4200,也收不到任何回应,这也是预料中的结果,因为主线程被 block 了。

下面代码是模拟 Node.js SSR 不再响应任何请求的场景:

// server.ts
  
  /*...*/

  let neverSendResponsesAnymore = false;

  // All regular routes use the Universal engine
  server.get('*', (req, res) => {
    if (req.url.endsWith('?never-send-responses-anymore')) {
      neverSendResponsesAnymore = true;
    }

    if (neverSendResponsesAnymore) {
      return;
    }

    res.render(indexHtml, {
      req,
      providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }],
    });
  });

下面这段高亮代码会导致 SSR 不响应客户端请求:

这两段代码均来自我的同事 Kris.

标签:Web,服务器端,js,000,504,SSR,block,请求
From: https://www.cnblogs.com/sap-jerry/p/17133535.html

相关文章

  • WEB版双色球号码随机生成代码(chatgpt)
    <!doctypehtml><html><head><title>双色球号码随机生成</title><scripttype="text/javascript">functiongenerateBall(){......
  • ctfshow web入门 命令执行 web58-71
     都是POST传递参数执行eval()函数web58if(isset($_POST['c'])){$c=$_POST['c'];eval($c);}else{highlight_file(__FILE__);}没有进......
  • Java Web(三)HTML 和 CSS
    HTML和CSS什么是HTML?HTML是一门语言,所有的网页都是用HTML这门语言编写出来的HTML(HyperTextMarkupLanguage):超文本标记语言 超文本:超越了文本的限制,比普通文本更强大......
  • Java Web(四)JS
    JS什么是JavaScript?JavaScript是一门跨平台、面向对象的脚本语言,来控制网页行为的,它能使网页可交互W3C标准:网页主要由三部分组成结构:HTML表现:CSS行为:JavaScriptJavaScript......
  • 62-CICD持续集成工具-Jenkins构建Golang的web项目
    实现Golang应用源码编译并部署安装Golang环境#编译安装[root@jenkins~]#catinstall_go.sh#!/bin/bashGO_VERSION=1.18.4URL=https://studygolang.com/dl/golang/go${......
  • WEB开发中的页面跳转方法总结
    页面跳转可能是由于用户单击链接、按钮等触发的,也可能是系统自动产生的。页面自动跳转在WEB开发中经常用到,而且根据需求可以采用不同的跳转方式,比如提示操作信息后延时跳转......
  • Webpack中Loader和Plugin
    1.首先两者都是为了扩展webpack的功能2.Loader:webpack视一切文件为模块,但webpack原生只能解析js文件,如果想将其他文件也打包的话,就会用到loader。它只专注于转化文件......
  • 一次web系统的nginx配置恢复
    前言:组里有一个小伙子,为了升级nodejs,安装各种库,把系统给搞崩溃了,无法登录。找运维人员也不行,最后的解决办法换一台机器。幸好原来只有一块盘,所以数据还在。 $mva/b/......
  • Java Web(二)MyBatis
    MyBatis一.MyBatis简介1.什么是MyBatisMyBatis是一款优秀的持久层框架,用于简化JDBC开发MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundati......
  • Vite 与 Webpack的区别
    1.什么是Vite?Vite是尤雨溪在开发vue3的时候开发的一个web开发构建工具。极速的服务启动:使用原生ESM文件,无需打包!轻量快速的热重载:无论应用程序大小如何,都......