0

Mongoose、Express、NodeJS を使用して承認システムを実装しています。

各投稿には 2 セットの承認があります。

私は以下のようにモデルを実装しました:

Post Schema:
var PostSchema = new Schema({
UserId: { type: ObjectId, unique: true, default: null },
/..
.. Object related fields
../
    Approval1: Object, //chidschema objects of approver
    Approval2: Object
});

Approval Mapping Schema:
var ApprovalMapSchema = new Schema({
  UserId: { type: ObjectId, unique: true, default: null },
  Approver1Id: { type: ObjectId, default: null },
  Approver2Id: { type: ObjectId, default: null }
});

関数で最初にマッピングを見つけてから、保存時にメインの投稿オブジェクトを更新しようとしています。

新しい投稿を保存する前に、両方の承認者 ID を取得する必要があります。

うまくいく方法を教えてください。私は現在やっています:

  1. Save を使用して新しい Post オブジェクトを保存します
  2. ApprovalMapSchema で findOne を使用して承認者 ID を取得する
  3. 承認者のエントリで Post オブジェクトを更新します。

    post.save(function(err, doc) { if (err) {} else { console.log({success: true, msg: 'Successful created new post', content: doc}); } });

    /*var actId = activation._id, distributorId, ttlId;
    
    var approvalMap = ApprovalMap.findOne({ userId: myUserId }, function(err, appMap) {
        if (err) throw err;
        else{           
            Approver1Id = appMap.Approver1Id;
            Approver2Id = appMap.Approver2Id;
        }
    });
    
    // Create child objects after this and update as subdocument
    

これは私にとってはうまくいきません。助けてください!

4

2 に答える 2

1

あなたの質問を理解するのに苦労しています。しかし、次のようなことをしたいようです (やりたいことに基づいてこれを変更する必要がありますが、非同期動作を処理する 1 つの方法を示してくれることを願っています)。

    //This will run a query that returns a document where userId == myUserId

    ApprovalMap.findOne({ userId: myUserId }, function(err, appMap) {

        if (err) throw err;

        //Once the query is complete function(err, appMap) will be called
        //err will contain an error object if there was an error
        //appMap will be the data returned by the query.
        //within this block you can run another query
        //for example

        ApprovalMap.findOne({approved:'some variable'},function(err, secondQueryData){

            if (err) throw err;

            //after this query is complete function(err, secondQueryData) will be called
            //once again the err argument will be an error, and the 

            //secondQueyrData argument will contain your return data

            //here you can do something with the data
            //for example, log the results

            console.log(secondQueryData)
        })
    });

ご覧のとおり、他のクエリのコールバック内に追加のクエリまたはステップをネストできます。これにより、物事が正しい順序で実行されることが保証されます。また、npm async ライブラリ、または q や bluebird などの promise ライブラリをチェックアウトすることもできます。また、ノードで非同期動作を処理するための優れたソリューションもいくつかあります。

于 2016-03-26T20:51:15.473 に答える
0

@ user2263572 の提案に従って、非同期ライブラリを使用しました。

これが私が今それを実装した方法です:

async.waterfall(
    [
        function(callback){
            ApprovalMap.findOne({ userId: myUserId }, function(err, appMap) {
                if (err) throw err;
                else{           
                    //..Create child approval elements and assign Ids from map
                    callback(err, Approver1Child, Approver2Child);
                }
            });
        },
        function(Approver1Child, Approver2Child, callback){
            var post = new Post(req.body);
            post.distApproval = Approver1Child;
            post.ttlApproval = Approver2Child;
            post.userId = myUserId;
            callback(null, post);
        }
    ], 
    function(err, post){
        //creating new order
        post.save(function(err, doc) {
            if (err) {
            }
            else
            {
                console.log({success: true, msg: 'Successful created new post', content: doc});
            }
        });
    }
);

どうもありがとう @ user2263572 !! 乾杯!

于 2016-03-27T06:23:56.340 に答える