expressjs-请求主体更改,即使不使用

时间:2018-10-11 13:10:10

标签: node.js express

我有一个用ExpressJ开发的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()
    }
  }
  )
});

完成我的Redis数据库更新后,req.body的一些变化。为什么身体会改变?

2 个答案:

答案 0 :(得分:0)

我猜测您的意思是reqBody发生了更改,这与预期的一样,因为您没有在函数开始时正确声明该变量,这意味着它将被提升为全局变量并在所有请求之间共享

解决方法是使用正确的变量声明:

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

答案 1 :(得分:0)

JavaScript通过引用管理对象

意味着将reqBody.pms分配给pmsCache时,它并没有在内存中创建新变量,而只是分配了原始变量的地址。

了解有关javascript对象引用的更多信息

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

要解决您的问题,您应该使用此

function deepClone(data){
    return JSON.parse(JSON.stringify(data));
} 

var pmsCache = deepClone(reqBody.pms);