【问题标题】:How to handle Fields on concurrent requests?如何处理并发请求的字段?
【发布时间】:2021-04-22 10:55:39
【问题描述】:

我是 NODE-JS 的新手,在我的 NODE-JS API 字段未正确重置,在下面,我使用属性来存储异步方法结果但在并发请求时遇到困难,有时字段未正确重置,所以程序的行为异常。

如何处理并发请求的属性?

  let _companyId ;
  let _companyName ;

  let _deals={};
  let _currentPipeline;
  let _currentDealState;
  let _validCounter = 0;
  let _salesPipelineDeal = {};
  let _csAccountDeal = {};
  let _csDealColseDate;
app.post("/progression", async (req, res) => {

try{

  _companyId = req.body.objectId;
  _companyName = req.body.properties.name.value;
  
  _deals= await getCompanyAssociatedDealsDetail(companyId);
  
   let newMergeDeal = await createNewMergeDeal(newMergeDealObj);
   await updatePreviousCSDeal(csAccountDeal.dealId);
   
      _deals={};
      _currentPipeline=null;
      _currentDealState=null;
      _validCounter = 0;
      _salesPipelineDeal = {};
      _csAccountDeal = {};
      _csDealColseDate=null;

   return res.status(200).send("new Merge Deal " + newMergeDeal.dealId);
}
catch(error)
{
}

});

【问题讨论】:

  • 告诉我getCompanyAssociatedDealsDetailcreateNewMergeDealupdatePreviousCSDeal,它们是基于承诺的吗?
  • 是的,他们是!都是异步方法。
  • 你确定吗??因为这段代码是正确的
  • 并发当我请求 API 时,它的行为出乎意料,一次或部署后第一个请求完美运行。
  • 用户字段未重置,因此之前的值仍然存在并出现意外行为。可以指导我如何在并发请求的 api 上使用字段/属性。

标签: node.js concurrency async-await


【解决方案1】:

看下面的例子

let myObj = {
  a: 1,
  b: 2
};
let objCopy = myObj;
console.log(myObj);    // {a: 1, b: 2}
console.log(objCopy);  // {a: 1, b: 2}

一个像赋值运算符这样的简单副本不会创建一个新副本,而是创建一个指向 myObj 的链接(也称为引用),然后看看如果我们尝试为副本分配新值会发生什么对象复制

objCopy.b = 10;
console.log(myObj);    // {a: 1, b: 10} what! but i never touched it

当您使用全局变量时,这会产生问题,因此您可以使用复制变量 Object.assignObject Spread ({...}) 或改变你的方法

【讨论】:

  • 没有全局变量需要将数据作为方法参数传递,对吧?声明字段/属性并在 node-js 中使用它们的最佳方法是什么?
  • 我更喜欢使用内存中的数据结构存储,例如Redis 在不同路由之间共享数据
  • 感谢您的建议,可以分享更多细节吗?
  • 首先我应该了解功能,做什么?! companyId in getCompanyAssociatedDealsDetail(companyId) 它是从哪里来的?还有 newMergeDealObj 在 createNewMergeDeal(newMergeDealObj) 中?还有 csAccountDeal.dealIdupdatePreviousCSDeal(csAccountDeal.dealId) 中?
  • 我这里就不放我的实际代码了,只是一个整体的看法,这样认为有一些以原始数据类型作为输入参数的异步方法,有一些功能,不喜欢传递数据作为函数参数,想要使用全局属性,所以函数只有名称的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
相关资源
最近更新 更多