2016-09-29 56 views
1

我有一個問題,我相信是貓鼬變量的範圍。我的代碼是這樣的:Mongoose(快速,節點,mongo)範圍問題與findOne()

var blogUserId; 
blogs.forEach(function(blog, index) { 
    User.findOne({'username': blog.username}, function(err, user) { 
    blogUserId = user._id; 
    console.log(blogUserId); 
    }); 
    console.log(blogUserId); 

    Blog.find({'title': blog.title}, function(err, blogs) { 
    if (!err && !blogs.length) { 
     console.log(blogUserId); 
     Blog.create({title: blog.title, author: blogUserId, body: blog.body, hidden: blog.hidden}); 
    } 
    if (err) { 
     console.log(err); 
    } 
    }); 
}); 

這僅僅是發展的種子文件的一部分,但我相當困惑,爲什麼它不會工作。 blogs只是要加載到集合中的一組對象。我已經搜索了所有類似的答案,但我還沒有找到解釋這個問題的正確答案。

回答

1

當您的Blog.find()被調用時,您的blogUserId未設置。你不得不窩不同的看法,這樣的事情:

var blogUserId; 
blogs.forEach(function(blog, index) { 
    User.findOne({'username': blog.username}, function(err, user) { 
    blogUserId = user._id; 
    console.log(blogUserId); 

    Blog.find({'title': blog.title}, function(err, blogs) { 
     if (!err && !blogs.length) { 
     console.log(blogUserId); 
     Blog.create({title: blog.title, author: blogUserId, body: blog.body, hidden: blog.hidden}); 
     } 
     if (err) { 
     console.log(err); 
     } 
    }); 

    }); 

}); 

我沒有測試過,所以我不相信有您的代碼中沒有其他錯誤,但肯定是你調用一個問題Blog.find,預計blogUserId可能在User.findOne回調中設置之前設置。

它可以用更具可讀性的方式使用命名回調進行書寫。

在Node中工作時,需要記住您正在異步環境中工作。

+0

謝謝,就是這樣,無論如何這個結構會變得更有意義 –