1

埋め込まれたドキュメント用に別のモデルを作成して検証し、検証が成功した場合はメインドキュメントのプロパティとして設定することで、配列されていないネストされたドキュメントを偽造しようとしています。

POST / api / documentルートで、私は次のことを行っています。

var document = new DocumentModel({
  title: req.body.title
});

var author = new AuthorModel({
  name: req.body.author.name
});

author.validate( function( err ) {
  if (!err) {
    document.author = author.toObject();
  } else {
    return res.send( err, 400 );
  }
});

console.log( document );

しかし、それは機能していないようです-コンソールは作成者なしでドキュメントを印刷します。ここで非常に明白な何かが欠けている可能性があります。ネストされたコールバックを実行する必要があるか、document.set('author'、author.toObject())などの特別なセッターメソッドを使用する必要があります...しかし今のところ、自分でそれを理解することはできません。

4

2 に答える 2

0

author.validateは非同期のように見えるのでconsole.log(document);、下部のステートメントは、設定したコールバックの前に実行されdocument.authorます。コールバック内に設定されていることに依存する処理を配置する必要がありdocument.authorます。

于 2012-08-03T12:52:16.717 に答える
0

答えは、コールバックを使用してdocument.authorを設定し、スキーマで作成者を定義することのようです。

@JohnnyHKが指摘したように、author.validateは非同期であるため、元のコードを使用してドキュメントをコンソールに記録することはできません。したがって、解決策は、console.log(およびおそらくさらにdocument.save()をauthor.validate()のコールバック内にラップすることです。

また、Mongooseは、スキーマで定義されていないモデルのプロパティを「設定」していないようです。私の作成者はオブジェクトであるため、このようにスキーマの作成者フィールドを混合に設定する必要がありました。

次のコードが機能します。

var DocumentModel = new Schema({
    title: { type: String, required: true },
    author: {}      
});
var AuthorModel = new Schema({
    name: { type: String, required: true }
});
app.post("/api/documents", function(req, res) {
    var document = new DocumentModel({
        title: req.body.title
    });
    var author = new AuthorModek({
        title: req.body.author.name
    });
    author.validate( function( err ) {
        if (!err) {
            document.author = author;
            docment.save( function( err ) {
                ...
            });
        } else {
            return res.send( err, 400 );
        }
    })
});
于 2012-08-03T19:50:09.763 に答える