提问者:小点点

为什么它只返回模拟数据库中的第一个id?


简而言之,我试图创建一个简单的api,它将返回具有匹配ID的用户。我使用postman向使用Node.js和Express创建的本地主机发送请求。当我请求第一个用户时,它工作得很好,但当请求“john”时,它会抛出一个错误。我正在编写一门udemy课程的代码,但除了材料过时之外,我不知道问题是什么。错误为“错误[ERR_HTTP_HEADERS_SEND]:将标头发送到客户端后无法设置标头”

null

 users: [
    {
      id: "123",
      name: "Sally",
      email: "sally@gmail.com",
      password: "bananas",
      entries: 0,
      joined: new Date(),
    },
    {
      id: "124",
      name: "John",
      email: "john@gmail.com",
      password: "apples",
      entries: 0,
      joined: new Date(),
    },
  ],
};
 
 app.get("/profile/:id", (req, res) => {
  const { id } = req.params;
  let found = false;
  database.users.forEach((user) => {
    if (user.id === id) {
      found = true;
      return res.json(user);
    }
    if (!found) {
      res.json("User not found");
    }
  });
});

null


共1个答案

匿名用户

从MDN Web文档:

除了引发异常之外,没有任何方法可以停止或中断foreach()循环。如果需要这样的行为,foreach()方法是错误的工具。

提前终止可通过以下方式完成:

  • 简单循环
  • 用于的...循环的
  • [Array.Prototype.every()][every]
  • [Array.Prototype.some()][some]
  • [Array.Prototype.find()][find]
  • [Array.Prototype.findIndex()][findIndex]

这意味着您的循环将运行所有元素,并实际上多次调用res.json,导致err_http_headers_send错误。有很多方法可以解决这个问题,这里有一个例子:

app.get("/profile/:id", (req, res) => {
    const {id} = req.params;      
    for (const user of database.users) {
        if (user.id === id) {
            return res.json(user);
        }
    }
    res.json("User not found");
});