1

我正在编写一个使用 Mongoose ODM 的 Express.js 应用程序。创建/更新文档时,我希望它自动填充一些字段:

  • 由...制作
  • 创建于

在我看来,实现该功能的正确位置是在 Mongoose 插件中,该插件使用这些属性扩充文档并提供默认值和/或 mongoose 中间件来填充字段。

但是,我完全不知道如何从插件中的会话中获取用户名。有什么建议吗?

/**
 * A mongoose plugin to add mandatory 'createdBy' and 'createdOn' fields.
 */
 module.exports = exports = function auditablePlugin (schema, options) {
   schema.add({
     createdBy: { type: String, required: true, 'default': user }
   , createdOn: { type: Date, required: true, 'default': now }
   });
 };

 var user = function(){
   return 'user'; // HOW to get the user from the session ???
 };

 var now = function(){
   return new Date;
 };
4

1 回答 1

0

您不能这样做,user因为添加了函数作为此模式的原型方法。特别是它是独立于请求/响应的。然而,有一个黑客。如果你有obj类型的对象schema,那么你可以做

obj.session = req.session;

在请求处理程序中。然后您可以从该功能访问会话。但是,这可能会导致其他问题(例如在此集合上运行 cron 作业),这对我来说似乎是一种非常糟糕的做法。

当当前用户创建此模式对象时,您可以手动执行此操作,不是吗?或者创建静态方法:

MySchema.statics.createObject = function ( user ) {
    // create your object
    var new_object = MySchema( ... );
    // set necessary fields
    new_object.createdBy = user.username;
}
于 2012-08-02T10:39:37.580 回答