2016-09-29 14 views
1

)私は、マングースの変数の範囲であると考えている問題に悩まされています。私のコードはこれです:mongoose(express、node、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.findUser.findOneコールバックで設定される前にblogUserIdが設定されている可能性があります。

名前付きコールバックを使用してより読みやすい方法で記述できます。

ノードで作業する場合は、非同期環境で作業していることに注意する必要があります。

+0

ありがとうございました、それは、その構造がとにかくはるかに理にかなっています –