Проблема маршрутизации Express Server - PullRequest
0 голосов
/ 17 марта 2019

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

const express = require('express');

require('./db/mongoose');
const User = require('./models/user');
const Task = require('./models/task');

const app = express();
const port = process.env.PORT || 3000;

app.use(express.json());

//  ***removed code for brevity
// Route for fetching user by id

app.get('/users/:id', (req, res) => {
    //console.log(req.params.id);
    const _id = req.params.id;

    User.findById(_id)
        .then(user => {
            //console.log(user)
            if (!user) {
                return res.status(404).send();
            }
            res.send(user);
        })
        .catch(e => {
            res.status(500).send();
        });
});

Таким образом, если я проверяю маршрут на Почтальоне и ввожу правильный идентификатор пользователя из базы данных, я получаю этого пользователя обратно, что является правильным ответом. Но если я введу неправильный идентификатор пользователя, я получу ответ с кодом ошибки 500 вместо кода ошибки 404. Оператор if (! User) пропускается, и я не могу понять, почему. Есть мысли о том, что мне не хватает?

1 Ответ

0 голосов
/ 17 марта 2019

Запустив этот проект через мой личный проект mongoose / express-using, я получаю следующую ошибку:

 UnhandledPromiseRejectionWarning: CastError: Cast to ObjectId failed for value "12345" at path "_id" for model "User"

Это в основном означает, что Mongoose ожидает свой собственный конкретный тип объекта, "ObjectId". Это немного сложно, так как обычно, если вы используете .findOne ({_ id: что-то), вы можете просто использовать строку. Если мы сделаем:

User.findById(mongoose.Types.ObjectId(_id))

это должно работать. Обратите внимание, что если вы используете недопустимый идентификатор (как я, очевидно, здесь и сделал, он выдаст ошибку все равно . По этой причине я бы использовал стандартный формат NodeJS для штук обратного вызова:

.then((err,result)=>{
   //other stuff
});

В общем случае, блок .catch () должен выполняться только в том случае, если очевидно Mongoose и ваш маршрутизатор не может обработать.

РЕДАКТИРОВАТЬ: Кроме того, для других, Mongoose.model.findById является встроенным вспомогательным методом и должен в основном делать именно то, что он говорит на банке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...