mongoose-serialization-proxy-plugin
v0.3.0
Published
Hide mongo model properties when JSON.stringify for mongoose plugin.
Downloads
9
Maintainers
Readme
mongoose-serialization-proxy-plugin
Hide secret properties of mongo model when serialize the model with JSON.stringify
.
Motivation
- [ ] TODO
Features
- Support
Schema#toJSON
- Support assignment value using Proxy
- Support dry-run mode
- Support logging
Install
Install with npm:
npm install mongoose-serialization-proxy-plugin
Usage
import { mongooseSerializationProxyPlugin } from "mongoose-serialization-proxy-plugin";
(async function(){
const UserSchema = new Schema({
name: String,
email: String,
password: {
type: String,
access: "private"
},
secretSettings: {
type: Schema.Types.Mixed,
access: "private"
},
secretObject: {
child: {
type: Schema.Types.Mixed,
access: "private"
}
}
});
// Register plugin
UserSchema.plugin(mongooseSerializationProxyPlugin({
// No "access" defined value, will be "public"
defaultSchemaAccess: "public"
}));
// Create Model
const User = model("User", UserSchema);
const userJoe = new User({
name: "Joe",
email: "[email protected]",
password: "secret",
secretSettings: {
age: 12
}
});
await userJoe.save();
const user = await User.findOne({
name: "Joe"
});
if (!user) {
throw new Error("Not found findUserJoe");
}
// property reference is ok
assert.strictEqual(user.password, "secret");
assert.deepStrictEqual(user.secretSettings, { age: 12 });
// serialization should be filtered
// password and secretSettings should be omit
assert.deepStrictEqual(user.toJSON(), { "name": "Joe", "email": "[email protected]" });
assert.strictEqual(JSON.stringify(user), `{"name":"Joe","email":"[email protected]"}`);
// Assignment value should be filtered
// secretSettings should be omit
const secretSettings = user.secretSettings;
assert.strictEqual(JSON.stringify(secretSettings), `{}`);
})();
Example: Only Logging
Pass through toJSON, but call toJSONCallback
function.
import { mongooseSerializationProxyPlugin } from "mongoose-serialization-proxy-plugin";
(async function(){
const UserSchema = new Schema({
name: String,
email: String,
password: {
type: String,
},
secretSettings: {
type: Schema.Types.Mixed,
},
secretObject: {
child: {
type: Schema.Types.Mixed,
}
}
});
// Register plugin
UserSchema.plugin(mongooseSerializationProxyPlugin({
// no modify json object
dryRun: true,
// callback
toJSONCallback: (oldJSON, newJSON) => {
// It is called when json stringify the mongo model
}
}));
// Create Model
const User = model("User", UserSchema);
const userJoe = new User({
name: "Joe",
email: "[email protected]",
password: "secret",
secretSettings: {
age: 12
}
});
await userJoe.save();
const user = await User.findOne({
name: "Joe"
});
if (!user) {
throw new Error("Not found findUserJoe");
}
// it will call `toJSONCallback` callback
JSON.stringify(user);
})();
Changelog
See Releases page.
Running tests
Install devDependencies and Run npm test
:
make up
npm test
Contributing
Pull requests and stars are always welcome.
For bugs and feature requests, please create an issue.
- Fork it!
- Create your feature branch:
git checkout -b my-new-feature
- Commit your changes:
git commit -am 'Add some feature'
- Push to the branch:
git push origin my-new-feature
- Submit a pull request :D
Author
License
MIT © azu