Express JS在将非字段属性返回给客户端之前,将其注入Mongoose模型的正确方法是什么

Express JS在将非字段属性返回给客户端之前,将其注入Mongoose模型的正确方法是什么,express,mongoose,Express,Mongoose,使用Mongoose模型方法findOne,我收到一个模型。现在,我想在将该模型发送到客户机之前对其进行定制,在该模型中增加几个属性 然而,目前我发现的唯一方法是将该模型转换为普通对象并扩展该对象 我不知道有没有更好的方法 以下是我的冗长代码,目的很简单: Topic.find({}).exec(function (err, topics) { var i, topic_obj, topic_obj_list; topic_obj_list = []; if (err) { ret

使用Mongoose模型方法
findOne
,我收到一个模型。现在,我想在将该模型发送到客户机之前对其进行定制,在该模型中增加几个属性

然而,目前我发现的唯一方法是将该模型转换为普通对象并扩展该对象

我不知道有没有更好的方法

以下是我的冗长代码,目的很简单:

Topic.find({}).exec(function (err, topics) {
  var i, topic_obj, topic_obj_list;
  topic_obj_list = [];

  if (err) { return next(err); }

  for (i = 0; i < topics.length; i++) {
    topic_obj = topics[i].toObject();

    if (req.user.is_following) {
      topic_obj.is_following = true;
    } else {
      topic_obj.is_following = false;
    }

    topic_obj_list.push(topic_obj);
  }

  return res.json(200, topic_obj_list);
});
Topic.find({}).exec(函数(err,topics){
变量i、主题对象、主题对象列表;
主题对象列表=[];
if(err){返回下一个(err);}
对于(i=0;i

p/S:我已经尝试过简单的解决方案,如:topics[I]。is_following=true,但它不起作用。

您可以将其缩短为以下内容:

Topic.find({}).exec(function (err, topics) {
  if (err) { return next(err); }

  return res.json(topics.map(function(topic) {
    return topic.set(
      'is_following',
      req.user.is_following ? true : false,
      { strict : false }
    );
  }));
});
说明:

  • topics.map
    topics
    数组的每个项目运行一个函数;从函数返回的值在
    map
    返回的结果中结束
  • 使用
    topic.set(字段,值,[{strict:false}])
    可以添加/覆盖Mongoose文档的字段;当
    strict
    false
    时,该字段不必存在于架构中