findById (req.params.id) возвращает ноль в качестве ответа? - PullRequest
0 голосов
/ 05 октября 2019

Моя проблема отличается от других, когда я передаю /: id, тогда я возвращаю JSON, да, это нормально, но проблема в том, что когда я даю неправильный objectId, он возвращает нулевое значение с помощью statusCode 200 вместо ошибки, что этот идентификатор неверен. согласно моему восприятию, он вызывает блок .catch вместо блока .then, потому что id отсутствует в базе данных.

const get_id_docs = async (req, res) => {
    await models
        .findById(req.params.id)
        .then(result => {
            res.send(result)
            })
        .catch(err => {
            res.sendStatus(404).send("Link Not Found")
        })
};

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Существует два случая: один неверный идентификатор, а другой - действительный идентификатор, но его нет в базе данных.

Если вы хотите различить неверный идентификатор, вы можете проверить его перед запросом, иreturn 404.

Также вы смешали асинхронное ожидание и Обещание, в этом случае необходимо использовать один из них.

const mongoose = require("mongoose");

const get_id_docs = async (req, res) => {
  const isValidId = mongoose.Types.ObjectId.isValid(req.params.id);

  if (!isValidId) {
    res.status(404).send("Link Not Found - invalid id");
  }

  try {
    const result = await models.findById(req.params.id);
    if (result) {
      res.send(result);
    }
    res.status(404).send("Link Not Found - does not exists");
  } catch (err) {
    res.status(500).send(err.message);
  }
};

И если вы предпочитаете, то поймайте

const mongoose = require("mongoose");

const get_id_docs = (req, res) => {
  const isValidId = mongoose.Types.ObjectId.isValid(req.params.id);

  if (!isValidId) {
    res.status(404).send("Link Not Found - invalid id");
  }

 models.findById(req.params.id).then(result => {
         if (result) {
             res.send(result);
          }
          res.status(404).send("Link Not Found - does not exists");
     })
    .catch (err) {
        res.status(500).send(err.message);
     }
};
0 голосов
/ 05 октября 2019

Вы создаете различные библиотеки общего назначения, которые удовлетворяют различным случаям использования. В частности, структуры абстракции базы данных, как правило, пытаются наложить процент как фасада на базовые хранилища данных. В JavaScript такие методы, как Array.prototype.find, возвращают undefined, а не выдают ошибки. И я думаю, что авторы mongoose пытаются написать API-интерфейсы с аналогичным поведением.

В дополнение к обеспечению интуитивного поведения по умолчанию, не выбрасывая ошибки, это позволяет использовать более широкий диапазон вариантов использования, таких как проверка на существование, дляобрабатываться без шаблонов.

Учитывая это, вам нужно что-то вроде следующего:

const get_id_docs = async (req, res) => {
    const result = await models.findById(req.params.id);
    if (result) {
        res.send(result);
    } 
    res.sendStatus(404).send("Link Not Found");    
 };

Обратите внимание, что вышеприведенное имеет другие преимущества, в том числе то, что оно не распространяет другие виды ошибок как 404 произвольно.

...