猫鼬吸气剂不适用于数组
Mongoose getters not working on arrays
我正在尝试通过 Node.js api 在 mongodb 集合上进行一些加密。除了解密位于数组/嵌套文档中的任何数据外,我遇到的解决方案似乎在大多数情况下都有效。
到目前为止的代码..
memberModel.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var crypto = require('crypto');
var connection = mongoose.connection;
var memberSchema = new Schema({
title: {type: String, trim: true},
firstname: {type: String, trim: true, get: decrypt, set: encrypt},
lastname: {type: String, trim: true},
address: [{
addressRef: {type: String, trim: true},
address1: {type: String, trim: true, get: decrypt, set: encrypt},
postcode: {type: String, trim: true}
}],
...
} , { collection: 'memberStage'});
memberSchema.set('toObject', { getters: true });
memberSchema.set('toJSON', { getters: true });
function encrypt(text){
var cipher = crypto.createCipher('aes-256-cbc', 'test');
var crypted = cipher.update(text,'utf8','hex');
crypted += cipher.final('hex');
return crypted;
};
function decrypt(text){
if (text === null || typeof text === 'undefined') { return text;};
var decipher = crypto.createDecipher('aes-256-cbc', 'test');
var dec = decipher.update(text,'hex','utf8');
dec += decipher.final('utf8');
return dec;
};
module.exports = connection.model('memberStage', memberSchema);
member.js
member.find(query, function(err, member){
res.status(200).json({
meta : { success: true, message: 'Member Data'},
data : member
});
});
在数据库中,firstname 和 address.address1 字段都按预期加密,但是从 member.find 调用返回的 json returns 是解密的 firstname,但 address1 字段仍然是加密。
{
"meta": {
"success": true,
"message": "Member Data"
},
"data": [
{
"_id": "5b1072549378101218c7039c",
"title": "Mr",
"firstname": "Test",
"lastname": "Record",
"address": [
{
"addressRef": "Home",
"address1": "cfefdf8c4813fac7bcc34d919aa81483",
"postcode": "PST CDE",
}
]
}],
...
}
如能就此问题提供任何帮助,我们将不胜感激。
地址应定义为模式并对其 getter 应用相同的 toObject
和 toJSON
处理。
var addressSchema = new Schema({
addressRef: {type: String, trim: true},
address1: {type: String, trim: true, get: decrypt, set: encrypt},
postcode: {type: String, trim: true}
})
var memberSchema = new Schema({
title: {type: String, trim: true},
firstname: {type: String, trim: true, get: decrypt, set: encrypt},
lastname: {type: String, trim: true},
address: [addressSchema],
} , { collection: 'memberStage'});
addressSchema.set('toObject', { getters: true });
addressSchema.set('toJSON', { getters: true });
memberSchema.set('toObject', { getters: true });
memberSchema.set('toJSON', { getters: true });
我正在尝试通过 Node.js api 在 mongodb 集合上进行一些加密。除了解密位于数组/嵌套文档中的任何数据外,我遇到的解决方案似乎在大多数情况下都有效。
到目前为止的代码..
memberModel.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var crypto = require('crypto');
var connection = mongoose.connection;
var memberSchema = new Schema({
title: {type: String, trim: true},
firstname: {type: String, trim: true, get: decrypt, set: encrypt},
lastname: {type: String, trim: true},
address: [{
addressRef: {type: String, trim: true},
address1: {type: String, trim: true, get: decrypt, set: encrypt},
postcode: {type: String, trim: true}
}],
...
} , { collection: 'memberStage'});
memberSchema.set('toObject', { getters: true });
memberSchema.set('toJSON', { getters: true });
function encrypt(text){
var cipher = crypto.createCipher('aes-256-cbc', 'test');
var crypted = cipher.update(text,'utf8','hex');
crypted += cipher.final('hex');
return crypted;
};
function decrypt(text){
if (text === null || typeof text === 'undefined') { return text;};
var decipher = crypto.createDecipher('aes-256-cbc', 'test');
var dec = decipher.update(text,'hex','utf8');
dec += decipher.final('utf8');
return dec;
};
module.exports = connection.model('memberStage', memberSchema);
member.js
member.find(query, function(err, member){
res.status(200).json({
meta : { success: true, message: 'Member Data'},
data : member
});
});
在数据库中,firstname 和 address.address1 字段都按预期加密,但是从 member.find 调用返回的 json returns 是解密的 firstname,但 address1 字段仍然是加密。
{
"meta": {
"success": true,
"message": "Member Data"
},
"data": [
{
"_id": "5b1072549378101218c7039c",
"title": "Mr",
"firstname": "Test",
"lastname": "Record",
"address": [
{
"addressRef": "Home",
"address1": "cfefdf8c4813fac7bcc34d919aa81483",
"postcode": "PST CDE",
}
]
}],
...
}
如能就此问题提供任何帮助,我们将不胜感激。
地址应定义为模式并对其 getter 应用相同的 toObject
和 toJSON
处理。
var addressSchema = new Schema({
addressRef: {type: String, trim: true},
address1: {type: String, trim: true, get: decrypt, set: encrypt},
postcode: {type: String, trim: true}
})
var memberSchema = new Schema({
title: {type: String, trim: true},
firstname: {type: String, trim: true, get: decrypt, set: encrypt},
lastname: {type: String, trim: true},
address: [addressSchema],
} , { collection: 'memberStage'});
addressSchema.set('toObject', { getters: true });
addressSchema.set('toJSON', { getters: true });
memberSchema.set('toObject', { getters: true });
memberSchema.set('toJSON', { getters: true });