发送后无法设置标头:我在哪里放置最终响应?

时间:2015-08-18 14:40:49

标签: node.js mongodb express mongoose

我希望在这里有一点指导。基本上,我有一个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
        })
     })
 });

1 个答案:

答案 0 :(得分: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);
})