node/mongoose:在mongoose中间件中获取请求上下文

Gee*_*Jan 3 mongoose node.js

我正在使用mongoose(在节点上),我正在尝试使用Mongoose中间件向模型添加一些额外的字段.

我正在考虑经常使用的情况,想要添加lastmodifiedsince-date.但是,我还想自动添加已完成保存的用户的名称/ profilelink.

schema.pre('save', function (next) {
  this.lasteditby=req.user.name; //how to get to 'req'?
  this.lasteditdate = new Date();
  next()
})
Run Code Online (Sandbox Code Playgroud)

我正在使用护照 - http://passportjs.org/ - 这导致req.user存在,req当然是http请求.

谢谢

编辑

我已经定义pre了嵌入式模式,而我正在调用save嵌入式实例的父级.下面发布的解决方案(将arg作为保存的第一个参数传递)适用于非嵌入式案例,但不适用于我的案例.

Bil*_*ill 9

您可以将数据传递给您的Model.save()调用,然后将其传递给您的中间件.

// in your route/controller
var item = new Item();
item.save(req, function() { /*a callback is required when passing args*/ });

// in your model
item.pre('save', function (next, req, callback) {
  console.log(req);
  next(callback);
});
Run Code Online (Sandbox Code Playgroud)

不幸的是,这对今天的嵌入式模式不起作用(参见https://github.com/LearnBoost/mongoose/issues/838).一种解决方法是将属性附加到父级,然后在嵌入式文档中访问它:

a = new newModel;
a._saveArg = 'hack';

embedded.pre('save', function (next) {
  console.log(this.parent._saveArg);
  next();
})
Run Code Online (Sandbox Code Playgroud)

如果您确实需要此功能,我建议您重新打开我上面链接的问题.