首页 > 其他分享 >让 Spartacus 服务器端渲染引入 long API 调用超时机制的两种配置方法

让 Spartacus 服务器端渲染引入 long API 调用超时机制的两种配置方法

时间:2023-04-16 16:55:46浏览次数:38  
标签:const 服务器端 req long DELAY proxy http 超时 Spartacus

两种方法,使用 config.backend.timeout = { 浏览器:...,服务器:...} ,或者可以更具体地配置,即基于 Request 粒度,通过将 HTTP_TIMEOUT_CONFIG HttpContextToken 传递给 Angular HttpClient 的方法来针对每个具体请求进行配置。

在SSR(Node.js)中,超时处理耗时过长的外部http调用是一项尤为重要的改进,因为在Node.js中,与浏览器不同,Node.js 运行环境下并没有默认的外部http调用超时时间(浏览器通常会在长时间后超时长时间的http调用,例如1分钟)。

这种可配置的超时逻辑现在已经在Spartacus中的 Angular Http拦截器层面上实现。也就是说,在 Spartacus SSR long API timeout 功能发布之前,客户可以自己实现类似的逻辑,例如通过自己实现 Angular Http 拦截器来实现。

配置代码:

provideConfig({ 
  backend: { 
    timeout: { 
      server: 3_000,
      browser: 3_000
    }
  }
})

如何使用代理服务器制造后台 API 响应的延时效果

首先Install http-proxy tool:npm install -g http-proxy

然后开发一个 http-proxy.js server file

const httpProxy = require('http-proxy');
const http = require('http');

const proxy = httpProxy.createProxyServer({ secure: false });

const ENDPOINT_FOR_DELAY = 'consenttemplates';
const BACKEND_BASE_URL = 'https://jerry:9002';
const DELAY = 3000; // 手动硬编码的延时

/** custom predicate, whether we should delay a request */
const shouldDelay = (req) => {
  // Note: In browser there are 2 requests: preflight (OPTIONS) and actual request (GET).

  const result = req.url.includes(ENDPOINT_FOR_DELAY);
  result && console.log({ delay: DELAY, url: req.url, method: req.method });
  return result;
};

http
  .createServer(function (req, res) {
    const forwardRequest = () =>
      proxy.web(req, res, { target: BACKEND_BASE_URL });
    const delay = shouldDelay(req) ? DELAY : 0;
    setTimeout(forwardRequest, delay);
  })
  .listen(9002);

然后启动这个代理服务器:node http-proxy.js

最后在 .env-cmdrc 里指定环境变量 CX_BASE_URL:

  "dev": {
    "CX_BASE_URL": "http://localhost:9002"
  },

针对某个具体请求设置 timeout:

import { HTTP_TIMEOUT_CONFIG, HttpTimeoutConfig } from `@spartacus/core`;
​
/* ... */
​
​
return this.httpClient.get('/some/api', {
  context: new HttpContext().set(
    HTTP_TIMEOUT_CONFIG, 
    { server: 15_000 } // value in milliseconds 
  )
})

当超时真的发生之后,可以在 console 看到下列的警告消息:

Request to URL '${request.url}' exceeded expected time of ${timeoutValue}ms and was aborted.

总之,对于在 NodeJS 中运行的服务器端渲染应用程序的稳定性来说,为每个传出的 http 调用设置一个明确的超时时间是至关重要的。 否则,如果后端 API 响应非常慢(或从不响应),服务器端呈现的应用程序将等待响应很长时间(或永远)。 在这种情况下,为该应用程序分配的内存不会被释放,这会引起内存泄漏问题。

标签:const,服务器端,req,long,DELAY,proxy,http,超时,Spartacus
From: https://www.cnblogs.com/sap-jerry/p/17323547.html

相关文章

  • FTP数据连接既可能是客户端发起的,也可能是服务器端发起的 主动传输模式和被动传输模式
    主动传输模式和被动传输模式在FTP协议中,控制连接使用周知端口21。相反,数据传输连接的目的端口通常实现无法知道。FTP协议使用一个标准的端口21作为ftp-data端口,但是这个端口只用于连接的源地址是服务器端的情况,在这个端口上根本就没有监听进程。FTP的数据连接和控制连接的方向一般......
  • 【fastadmin】hasone和blongeto 怎么选?
    hasOne:有一个,加上主谓语应该是,A有一个BhasMany:有很多,A有很多BbelongsTo:属于,A属于B外键是主表中和关联表有关的字段,主键一般是关联表自己的id或者是和外键有关的字段hasOne和belongsTo这两种方法都可以应用在一对一关联上,但是两者也是有区别的:最主要的区别就在于:谁是......
  • Java中的long与double的区别
    1.long与double在java中本身都是用64位存储的,但是他们的存储方式不同,导致double可储存的范围比long大很多2.long可以准确存储19位数字,而double只能准备存储16位数字(实际测试,是17位,)。double由于有exp位,可以存16位以上的数字,但是需要以低位的不精确作为代价。如果一个大于17位的lo......
  • POJ 2774 Long Long Message (后缀数组)
    题目地址:POJ2774后缀数组第一发!后缀数组真是太神奇了。。(好像每学一种新算法我都会这么说。。原理研究了好长时间,还有代码的实现,论文作者罗穗骞的代码太简洁。。好难看懂QAQ,看了好长时间。来一发后缀数组模板题,模板是用的倍增思想。代码如下:#include<iostream>#include......
  • vue长按事件指令(v-longPress)
    importtype{Directive,App}from'vue';constlongPress:Directive={beforeMount:function(el,binding,vnode,prevVnode){if(typeofbinding.value!=='function'){throw'callbackmustbeafunction';......
  • 让 Spartacus 服务器端渲染引入 long API 调用超时机制的两种配置方法
    两种方法,使用config.backend.timeout={浏览器:...,服务器:...},或者可以更具体地配置,即基于Request粒度,通过将HTTP_TIMEOUT_CONFIGHttpContextToken传递给AngularHttpClient的方法来针对每个具体请求进行配置。在SSR(Node.js)中,超时处理耗时过长的外部http调用是一项尤为重......
  • .NET 8新预览版本使用 Blazor 组件进行服务器端呈现
    简介此预览版添加了对使用Blazor组件进行服务器端呈现的初始支持。这是Blazor统一工作的开始,旨在使Blazor组件能够满足客户端和服务器端的所有WebUI需求。这是该功能的早期预览版,因此仍然受到一定限制,但我们的目标是无论选择如何构建应用,都能使用可重用的Blazor组件。......
  • 01 | C语言异常处理(jmp_buf、setjmp、longjmp)
    首先说明,C语言中的异常处理主要还是错误码的思路.其次,C语言中是有返回两次的函数的,比如说fork()函数在C语言中是没有trycatch块的,但并不代表没有异常处理。接下来我们简单明确三个概念,最后来一个简单的小例子。1.三个概念使用一个jmp_buf的类型变量来充当异常......
  • 服务器端口无法访问
     1.防火墙:服务器上的防火墙可能会阻止端口连接。您需要在防火墙中打开相应的端口。2.端口未打开:如果您的服务器没有打开该端口,则客户端无法连接。您需要在服务器上打开相应的端口。3.ISP阻止:ISP可能会在其网络上阻止某些端口的连接。您需要联系ISP以了解其政策。4.路由器......
  • SAP Emarsys 和 SAP Spartacus 的集成
    要将WebExtendScriptsforEmarsys集成到SAPSpartacus中,可以按照以下步骤操作:在Spartacus项目的根目录中创建一个名为“emarsys”(或其他名称)的新文件夹,然后将EmarsysWebExtend脚本文件(例如12345.js)放入该文件夹中。在Spartacus项目的“index.html”文件中添加以下代码,以......