【问题标题】:Mapping array inside async function causes error在异步函数内映射数组会导致错误
【发布时间】:2019-07-25 23:50:29
【问题描述】:

您好,我的异步函数 (router.post()) 中有一组对象验证,我需要在验证之前对其进行映射,这就是我的做法

ingredients.map(({ingredient,quantity})=>{
   if(ingredient.trim().length < 1 || quantity.length < 1){
     return res.status(409).send({
       message: ''
     })
   }
})

在此之后我向客户端(ReactJS)发送 200 状态代码,但它会导致错误

发送后无法设置标题

我不知道这是什么问题。

在此代码块之前,我只有 if 语句来验证其他输入,当我评论此代码块时,if 语句有效。那么这有什么问题呢?

P.S:我在发送服务器之前对数组进行了字符串化,然后当然会解析

编辑:当一切正常且成分或数量不为空时,它不会导致错误

【问题讨论】:

  • 好吧,不要循环调用res.status()res.send()。只发送一次响应。您想在响应消息中放入什么数据?
  • 好吧,但是只有 res.send() 很快就会被弃用,然后呢?
  • 快递 5x 将不再被接受
  • 当然你应该同时使用statussend,但是你应该一个都不要在一个循环中使用。
  • 检查你的ingredients数组是否有任何错误(例如使用every,而不是map)。然后,当数据中有一个(或多个)错误时,发送您的 409 响应。否则,如果没有错误,请发送您的其他回复。

标签: javascript arrays node.js express dictionary


【解决方案1】:

因为res.send 被多次调用而出现此问题。

如果您打算在至少一种成分无效的情况下回复409状态码,您可以检查是否存在至少一种无效商品,如果存在则回复409

const hasInvalidIngredient = ingredients.some(
  ({ingredient,quantity}) => ingredient.trim().length == 0 || quantity.length == 0
)

if (hasInvalidIngredient) {
  return res.status(409).send({
    message: ''
  })
}

【讨论】:

  • 我的意思是它不验证
  • @iLiA 您能否提供一个 ingredients 数组的示例,当验证不起作用时,它应该起作用?
  • [{配料:'foo',数量:'1'},{配料:'bar',数量:'2'}]
  • 由于quantity 是一个字符串,您可以将其解析为一个数字并相应地检查parseInt(quantity) &lt; 1。我已经更新了答案
  • 不需要解析它不必是数字它可以是例如1g或2kg
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 2012-10-09
  • 2021-01-06
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多