代码之家  ›  专栏  ›  技术社区  ›  cogitoergosum

expressjs-请求主体即使未使用也会更改

  •  0
  • cogitoergosum  · 技术社区  · 7 年前

    我在ExpressJs中开发了一个API,如下所示:

    router.post('/devices/data/*', function (req, res, next) {
      reqBody = req.body
      console.log(reqBody)
      var pmsCache = reqBody.pms; //pms key exists in body
      pmsCache.k1 = K1; //Adding a new key
      pmsCache.k2 = K2; //Adding a new key
      //
      // Insert into Redis pmsCache - successful
      //
      // Trying to insert into PostgreSQL
      rdbmsPool.connect((err, client, release) => {
        if (err) {
          console.error('Error acquiring client', err.stack)
          throw err
        } else {
          var v;
          var u = true;
          var pms = reqBody.pms
          console.log(reqBody) // This has K1 and K2 - Why ?
          //
          // Logic to insert values into db
          //
          release()
        }
      }
      )
    });
    

    req.body 在我完成Redis数据库更新后,有些方法会发生变化。为什么身体会改变?

    2 回复  |  直到 7 年前
        1
  •  0
  •   Aabid    7 年前

    意味着当你分配 reqBody.pms pmsCache 它不是在内存中创建一个新的变量,而是分配原始变量的地址。

    https://codeburst.io/explaining-value-vs-reference-in-javascript-647a975e12a0

    为了解决你的问题你应该用这个

    function deepClone(data){
        return JSON.parse(JSON.stringify(data));
    } 
    
    var pmsCache = deepClone(reqBody.pms);
    
        2
  •  0
  •   robertklep    7 年前

    reqBody 更改,这是意料之中的,因为您没有在函数的开头正确地声明该变量,这意味着它被提升为全局变量

    解决方法是使用适当的变量声明:

    router.post('/devices/data/*', function (req, res, next) {
      const reqBody = req.body;
      ...
    
    推荐文章