«Не удается установить заголовки после их отправки клиенту» - я устанавливаю заголовок, но не могу найти где - PullRequest
0 голосов
/ 08 июля 2019

Я получаю сообщение об ошибке Cannot set headers after they are sent to the client при попытке POST при использовании промежуточного программного обеспечения для аутентификации. Я исследовал и обнаружил, что посылаю данные клиенту, прежде чем я думал, что я был. Но я не могу понять, где это происходит. Я думаю, что это в самом коде промежуточного программного обеспечения, потому что когда я запускаю код без промежуточного программного обеспечения, он работает отлично. Пожалуйста, прости мою плохую печать. Это работа в процессе. Я все еще выясняю, какие предметы я собираюсь получить.

Маршрут
app.post("/users/post-item", authenticate, itemController.postItem);

Auth Middleware

export const authenticate = async (
  req: Request,
  res: Response,
  next: NextFunction
) => {
  const token: any = req.headers["token"];
  if (!token) {
    console.log("No token");
    return res.status(400).send({ message: "Token is not provided" });
  }

  try {
    const decoded: any = await jwt.verify(token, "abc123");
    const user = await db("user").where({ id: decoded.id.id });

    req.body.user = { user };
    next();
  } catch (error) {
    return res.status(400).send(error);
  }
  next();
};

Контроллер

export const postItem = (req: Request, res: Response) => {
  const { itemName, price, description, user, location, species } = req.body;

  try {
    items
      .postItem({
        itemName: itemName,
        price: price,
        description: description,
        userId: user.user[0].id,
        location: location,
        species: species
      })
      .then((data: any) => {
        // Header is sent somewhere before here
        res.sendStatus(200);
      });
  } catch (error) {
    throw new Error(`Something went wrong: ${error}`);
  }
};

Функция PostItem

export const postItem = ({
  itemName,
  price,
  description,
  userId,
  location,
  species
}: {
  itemName: string;
  price: string;
  description: string;
  userId: string;
  location: string;
  species: string;
}): any => {
  return db("item_for_sale").insert({
    name: itemName,
    price,
    description,
    user_id: userId,
    location,
    species
  });
};```

1 Ответ

4 голосов
/ 08 июля 2019

Вы также вызываете next() после try..catch.Таким образом, функция next вызывается два раза.

  try {
    const decoded: any = await jwt.verify(token, "abc123");
    const user = await db("user").where({ id: decoded.id.id });

    req.body.user = { user };
    next();
  } catch (error) {
    return res.status(400).send(error);
  }
  next();//<<<<====this next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...