Node.js 处理mongoose上的架构引用

Node.js 处理mongoose上的架构引用,node.js,asynchronous,mongoose,foreign-keys,Node.js,Asynchronous,Mongoose,Foreign Keys,我试图使用Node.js、mongoose和restify定义一个简单的RESTful API。目标是让用户能够对其他用户的配置文件进行评论。为此,我有一个评论端点,它接收文本、作者和评论的目标(其他用户) 我想引用用户,因此我定义了下一个架构: 用户架构: var mongoose = require('mongoose'); var Schema = mongoose.Schema; var UserSchema = new Schema({ "username": { type: S

我试图使用Node.js、mongoose和restify定义一个简单的RESTful API。目标是让用户能够对其他用户的配置文件进行评论。为此,我有一个评论端点,它接收文本、作者和评论的目标(其他用户)

我想引用用户,因此我定义了下一个架构:

用户架构:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var UserSchema = new Schema({
  "username": { type: String, unique: true, required: true },
  "password": { type: String, required: true },
  "comments": [{ type: Schema.Types.ObjectId, ref: 'Comment' }]
});

mongoose.model('User', UserSchema);
注释模式:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var CommentSchema = new Schema({
  date: { type: Date, default: Date.now },
  text: { type: String, required: true },
  author: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true },
  target: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true }
});

mongoose.model('Comment', CommentSchema);
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var User = mongoose.model('User');

var CommentSchema = new Schema({
  date: { type: Date, default: Date.now },
  text: { type: String, required: true },
  author: { type: Schema.Types.ObjectId, ref: "User", required: true },
  target: { type: Schema.Types.ObjectId, ref: "User", required: true }
});

CommentSchema.path('author').validate(function(value, respond) {
  User.findOne({ _id: value}, function(err, user) {
    respond(!err && user);
  });
}, 'Author doesn\'t exists');

CommentSchema.path('target').validate(function(value, respond) {
  User.findOne({ _id: value}, function(err, user) {
    respond(!err && user);
  });
}, 'Target user doesn\'t exists');

mongoose.model('Comment', CommentSchema);
我还有这个控制器(只显示createComment函数):

因此,我有三个问题:

  • 为什么我需要检查收到的用户是否存在?我只想接收id并存储它,但我必须自己再做两次查询来检查它
  • 我必须做什么才能将该用户作为目标存储在仅限用户的评论中在编辑的代码中求解
  • 如何简化此代码?按顺序执行异步查询是一种痛苦。我希望有一般性的错误,而不是必须处理每一个
编辑:我使用模式验证简化了代码:

注释模式:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var CommentSchema = new Schema({
  date: { type: Date, default: Date.now },
  text: { type: String, required: true },
  author: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true },
  target: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true }
});

mongoose.model('Comment', CommentSchema);
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var User = mongoose.model('User');

var CommentSchema = new Schema({
  date: { type: Date, default: Date.now },
  text: { type: String, required: true },
  author: { type: Schema.Types.ObjectId, ref: "User", required: true },
  target: { type: Schema.Types.ObjectId, ref: "User", required: true }
});

CommentSchema.path('author').validate(function(value, respond) {
  User.findOne({ _id: value}, function(err, user) {
    respond(!err && user);
  });
}, 'Author doesn\'t exists');

CommentSchema.path('target').validate(function(value, respond) {
  User.findOne({ _id: value}, function(err, user) {
    respond(!err && user);
  });
}, 'Target user doesn\'t exists');

mongoose.model('Comment', CommentSchema);
控制器:

exports.createComment = function(req, res, next) {
  var comment = new Comment(req.body);

  comment.save(function(err, comment) {
    if (err) {
      res.status(500);
      res.json({
        type: false,
        data: 'Error occurred: ' + err
      });
    } else {
      User.findOne({ _id: comment.target }, function(err, user) {
        user.comments.push(comment);
        user.save();
      });

      res.json({
        type: true,
        data: comment
      });
    }
  });
};
问题是,现在我必须在查询中使用_id(我想使用一个自定义id),每次我想保存一条注释时,我都要进行三次查询(两次用于验证,另一次用于存储注释)。有没有更好的办法

  • 您可以使用mongo中查询的
    select
    选项仅选择用户的_id字段,如下所示:

    User.findOne({u-id:req.params.authorId})。选择({u-id:1})。执行(函数(err,User){})

  • 从mongo中提取userTarget后,需要将注释添加到他的注释列表中,并保存他:
    target.comments.push(comment.\u id);
    save(函数(err,targetAfterSaved){})

  • 了解或,它们是我最喜欢使用异步函数处理的库。为了处理您想要的错误,您可以添加一些监听器——这是来自restify站点的文档

  • 希望你能理解,如果你需要帮助,请告诉我