簡體   English   中英

Node.js和for循環行為很奇怪

[英]Node.js and for loops acting weird

我正在為我的實習項目工作,他們在后端使用node.js和mongoDB。 這個設置目前確實不能很好地工作,因為我們實際上有關系數據,而mongoDB實際上並不是最好的。

我的問題是,我必須從數據庫中獲取一些需要在兩個表上“加入”的數據。 MongoDB不允許這樣做,所以我試圖手動完成。 我必須找到一個演出,並為每個工作類型(JobTypeLine)演出,找到有關受邀工作人員的信息。 RolodexMembersInterested是一個包含ID的數組,允許我們在RolodexMember“表”中查找人員信息。

json結構如下所示:

演出:

    {
        _id: {type: Schema.ObjectId},
        CreatedAt: {type: Date, default: Date.now()},
        EventName: {type: String, required: true},
        Headline: {type: String, required: true},
        Date: {type: Date, required: false},
        EndDate: {type: Date, required: false},
        Address: {type: String, required: false},
        Description: {type: String, required: true},
        CompanyName: {type: String, required: true},
        CompanyID: {type: String, required: true},
        Exposed: {type: Boolean, default: false},
        HashTags: {type: []},
        JobTypeLine: {type: [
            {
                JobType: {type: String, required: true},
                Briefing: {type: String, required: false},
                Quantity: {type: Number, required: true},
                StartTime: {type: String, required: true},
                EndTime: {type: String, required: true},
                NumberOfHours: {type: String, required: false},
                HourlySalary: {type: Number, required: false},
                RolodexMembersInvited: {type: [], default: []},
                RolodexMembersAssigned: {type: [], default: []},
                RolodexMembersInterested: {type: [], default: []}
            }
        ]},
    },

RolodexMember:

    {
        _id:{type:Schema.ObjectId},
        companyId: {type: String, required: true},
        userId: {type: String, required: false},
        userEmail: {type: String, required: true},
        comment: {type: String, required: false},
        payRate: {type: Number, required: false},
        name: {type: String, required: false},
        phone: {type: String, required: false},
        pictureUrl: {type: String, required: false},
        isHot: {type: Boolean, required: false},
        isInPaySystem: {type: Boolean, required: false},
        numberOfPreviousGigs: {type: Number, required: true, default: 0},
        previousGigs: [],
        otherAttributes: [
            {
                attributeName: {type: String, required: false },
                attributeValue: {type: String, required: false }
            }
        ],
    })

所以我寫了一個方法來“模擬”我的聯接:

    exports.getMembersInvitedToGig = function(req,res) {

        var jobTypes = [];
        var rolodexInvited = [];
        gigsModel.findOne({_id: req.body.gigId}, function(err, gig) {
            if(err) {
                console.log(err);
                res.send(404, "Couldn't find the gig with id: " + req.body.gigId);
            } else {
                for(var i=0;i<gig.JobTypeLine.length;i++){
                    rolodexInvited = [];
                    for(var j=0;j<gig.JobTypeLine[i].RolodexMembersInvited.length;j++) {
                        var userId = gig.JobTypeLine[i].RolodexMembersInvited[j];
                        getUserData(userId, function(data,success) {
                            if (success) {
                                rolodexInvited[j] = data;
                            }
                        });
                    }
                    jobTypes[i] = rolodexInvited;
                }
                res.send(200,jobTypes);
            }
        });
    }

    function getUserData (userId, callback) {
        var RolodexItem = mongoose.model('RolodexItems');
        RolodexItem.findOne({ _id: userId }, function (err, doc) {
            if (err) {
                console.log("There was an error in finding the rolodex item: " + err);
            } else {
                    callback(doc,true);
            }
        });
    }

我的問題是方法返回和空數組填充其他空數組(盡可能多的我有jobTypes)。 我知道getUserData函數工作正常並找到合適的人員信息等問題所在,似乎節點不等待數據在for(j)循環內返回並繼續(最終結束獲取)到res.send(200,jobTypes)而jobTypes實際上仍然是空的。我已經嘗試添加一個回調到getUserData來解決這個問題,但它沒有改變任何東西。

(現在我知道使用關系數據庫可以一起解決問題,但我真的沒有在這方面說出來,所以我必須讓它按原樣工作)。 可能還有一些非常糟糕的做法,因為我只是基於以前由其他人制作的功能,而且我注意到他們並不擅長它。 我之前從未使用過node.js,所以我沒有時間看一些正確的做法/等等。 (隨意指出任何寫得不好的東西,我很想學習“好”的方法)

問題是你的getUserData函數是異步的(因為findOne是異步的)。 所以你的for循環不會等待你的getUserData函數完成。 您應該使用異步庫(查看每個函數): https//github.com/caolan/async

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM