我有一个用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
的一些变化。为什么身体会改变?
答案 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);