2012-03-02 6 views
3

그냥 node.js로 놀기 시작 했으므로 JavaScript로 경험 한 적이 있지만 서버 측에서는 거의 경험하지 못했습니다.Node.js + Mongoose ... 제어 흐름 문제?

나는 다음과 같은 코드를 가지고 있으며 찾고자하는 기능이 Mongoose를 사용하여 컬렉션에 제품을 추가하는 것입니다. 그러나 'name'을 사용하여 복제본을 찾으면 제품을 포함 된 문서로 푸시합니다. duplicate는 product_ids, package info 등과 같은 선택 정보 만 가지고 있습니다. 문제는 findOne이 첫 번째 실행에서 중복 된 것을 찾지 못한다고 가정합니다. 두 번째로 실행하면 중복을 감지하지만 너무 늦었습니다. 이전 'save'가 발생한 후에 만 ​​findOne을 실행하는 방법을 모르겠습니다.

function insertProduct(data) { 
    var product; 
    Product.findOne({ 
     name: data.name 
    }, function(err, doc) { 
     if (err) throw err; 
     if (!doc) { 
      product = new Product({ 
       name: data.name 
       //other product data 
      }); 
      product.packages.push({ 
       //package data 
      }); 
     } 
     else if (doc) { 
      doc.packages.push({ 
       //package data 
      }); 
      product = doc; 
     } 
     product.save(function(err) { 
      if (err) throw err; 
      console.log('Added: ' + product.name); 
     }); 
    }); 
} 

request(url, function(error, response, body) { 
    if (!error && response.statusCode === 200) { 
     jsonResult = JSON.parse(body); 
     jsonResult.result.forEach(insertProduct); 
    } 
}); 

제어 흐름에 문제가 있다는 것을 깨달았습니다. 아직 보류 중입니다. 귀하의 도움을 주시면 감사하겠습니다!

답변

1

비 차단 IO의 세계에 오신 것을 환영합니다, 그리고 JavaScript closures :

주위에 간단한 방법은 제품 제작을 분리하고 제품이 성공적으로 생성 한 후 패키지를 밀어 것입니다.

addProduct = function(name, next) { 
    Product.findOne({name: name}, function(err, doc) { 
    if(doc) { 
     next(null, doc); 
    } 
    else { 
     // create new product... 
     var d = new Product({name: name}); 
     next(null, d); 
    } 
    }); 
}); 

// ... snipped 

jsonResult.result.forEach(function(item) { 
    addProduct(item.name, function(err, doc) { 
    if(err == null) { 
     doc.packages.push({ 
     // stuffs 
     }); 
     doc.save(); 
    } 
    }); 
}); 
+0

분명히 더 논리적 인 방법이지만, 트릭을 수행하지 않습니다. Product.findOne은 앱을 두 번째로 실행했을 때만 복제본을 찾습니다. 첫 번째 실행에서는 빈 컬렉션에서 시작하여 어떤 이유로 새로 작성된 문서가 표시되지 않으므로 중복 된 문서를 찾을 수 없습니다. 다른 아이디어? 다시 한 번 감사드립니다! – dnglbr