2015-08-18 32 views
0

我希望在這裏有一點指導。基本上,我有一個mondodb(通過貓鼬),它擁有品牌,產品和語言環境自定義表。發送後無法設置標題:我在哪裏放置最終響應?

我搜索特定品牌的所有產品,然後查詢區域設置自定義表以查看這些產品是否具有基於區域設置的自定義名稱。如果他們這樣做,那麼我想用自定義名稱替換productName。

現在,如果我使用下面的代碼調用具有自定義名稱的產品的子集,那麼我會在響應中使用更改後的名稱獲得正確的響應。

如果我調用一個沒有自定義名稱的子集,那麼我會遇到可怕的「發送後無法設置標題」。信息。

我明白爲什麼我不能發送頭兩次,但我似乎無法找到如何構建正確的響應併發送它。我已經把反應放在了我能想到的地方 - 設置變量(不會結轉),並在過去幾天基本上拉出了我的頭髮。不幸的是,我無法更改主品牌或產品數據(它是隻讀的),所以我被困在做這個查詢。

下面是我簡化的模式和代碼。任何幫助將不勝感激。

productsSchema = { 
    active: String, 
    brandName: String, 
    productName: String, 
    code: String 
    locale: String 
} 
localeCustomizationsSchema = { 
    locale: String, 
    products: [{ 
     productCode: String, 
     productCode: String 
    }] 
} 
router.get('/products/:locale/:code', function(req, res) { 
    products.findOne({ 
     active: "true", 
     locale: req.params.locale, 
     code: req.params.code 
    }, { 
     brandName: 1, 
     _id: 0 
    }, function(err, brand) { 
     if(err) return res.send(err) 
     if(!brand) return res.send(JSON.stringify({ 
     'Error': 'No products found for code ' + req.params.code 
     })) 
     products.find({ 
      active: "true", 
      locale: req.params.locale, 
      brandName: brand.brandName 
     }, { 
      productName: 1, 
      productCode: 1, 
      _id: 0 
     }, function(err, products) { 
      if(err) return res.send(err) 
      async.map(products, function(product, next) { 
       localecustomizations.findOne({ 
        locale: req.params.locale, 
        'products.productCode': product.productCode 
       }, function(err, result) { 
        if(err) return res.send(err) 
        if(result) { 
         product.productName = result.products[0].customName 
         return res.json(products) 
        } 
       }) 
      }) 
      return res.json(products) 
     }).sort({ 
      productName: 1 
     }) 
    }) 
}); 

回答

0

您沒有使用的async.map()最終回調,這就是你需要發送一個響應(所有產品均已映射):

async.map(products, function(product, next) { 
    localecustomizations.findOne({ 
    locale: req.params.locale, 
    'products.productCode': product.productCode 
    }, function(err, result) { 
    if (err) return next(err); 
    // TODO: make sure `result` and `result.products[0]` actually exist. 
    product.productName = result.products[0].customName 
    return next(null, product) 
    }) 
}, function(err, products) { 
    if (err) return res.send(err); 
    return res.json(products); 
}) 
+0

這一些錯誤修正後的工作完美。謝謝,羅伯特! – mkrieger

相關問題