当前位置: 首页 > 面试题库 >

节点/猫鼬:在猫鼬中间件中进入请求上下文

岳嘉悦
2023-03-14
问题内容

我正在使用mongoose(在节点上),并且尝试通过使用Mongoose中间件在保存时向模型添加一些其他字段。

我正在考虑要添加lastmodifiedsince-date的常用情况。但是,我也想自动添加完成保存的用户的名称/配置文件链接。

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

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

谢谢

编辑

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


问题答案:

您可以将数据传递给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);
});

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

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

embedded.pre('save', function (next) {
  console.log(this.parent._saveArg);
  next();
})

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



 类似资料:
  • 问题内容: 我想使用mongoose作为node.js的MongoDB包装器来检索最后插入的内容。我找到了以下教程,但是由于该应用程序在公共服务器上运行,因此无法更改任何节点模块: 获取“最后插入的ID”(提示- 您必须破解Mongoose) 还有其他想法吗?这是我想做的: 插入新用户 获取用户价值 根据用户ID设置新会话 重定向到/ 谢谢! 问题答案: 我正在使用猫鼬版本1.2.0,并且一旦创建

  • 问题内容: 我从Mongoose网站上阅读了快速入门,几乎复制了代码,但是无法使用Node.js连接MongoDB。 这是我的代码。控制台仅打印,不打印。我哪里错了? 问题答案: 调用时,它将建立与数据库的连接。 但是,您在以后的某个时间点(处理请求时)附加了事件侦听器,这意味着该连接可能已经处于活动状态,并且该事件已经被调用(您尚未监听它)。 。 您应该重新排列代码,以使事件处理程序尽可能(及时

  • 问题内容: 我正在研究猫鼬在mongodb中的数据库中列出一个集合中的所有数据: 根据要求: 我正在执行以下代码: 我已经在数据库中输入了条目,但是上面的代码返回了空值。为什么? 编辑:以下代码也返回空: 使用的架构: 问题答案: 您的问题是猫鼬将集合复数。猫鼬正在查询“组织”,但您的数据在mongodb中为“组织”。使它们匹配,您应该很好。您可以通过mongoshell在mongodb中对其重命

  • 问题内容: 我使用Mongoose.js,无法解决3级层次结构文档的问题。 有2种方法可以做到。 首先 -没有裁判。 我需要出示C记录。仅知道_id的C,如何填充/找到它? 我曾尝试使用: 但是我不知道如何从returnet得到一个对象,我只需要c对象。 其次, 如果使用裁判: 如何填充所有B,C记录以获取层次结构? 我试图使用这样的东西: 但是它将为single_c.title返回undefin

  • 问题内容: 我在子文档的Mongoose中尝试执行findOne查询,但运气不佳… 我的架构如下所示: 我只需要从我使用此查询的文档中查找用户的电子邮件 任何帮助,将不胜感激! 问题答案: 您缺少对象的级别,因此您的代码需要更改为以下内容:

  • 问题内容: 我已经定义了此路由,但是对它的任何请求都会卡在“待处理”中并永远运行。 当我记录代码时,我看到后面跟着,这意味着find方法中的代码永远不会执行 模型 关于这是为什么的任何想法? 问题答案: 在您致电之前,您的猫鼬查询只会简单地排队。 在启动代码中添加如下代码以进行连接: 在连接字符串中,用数据库名称替换。