Очень простой запрос get приводит к ошибке: «Преобразование в ObjectId не выполнено» - PullRequest
0 голосов
/ 05 февраля 2020

Итак, я тестировал свой бэкэнд с почтальоном и понятия не имею, что, черт возьми, происходит в данный момент. Я получил файл users.js, где я определяю некоторые из моих маршрутов. Я импортирую этот файл в мой app.js с помощью:

// Bring in the Users route
const users = require('./routes/api/users');
app.use('/api/users', users);

Так что все запросы API в users.js на самом деле собираются на /api/users/......

Я определил простой маршрут для тестирования это из.

const express = require('express');
const router = express.Router();

router.get('/', (req, res) => {
    res.send('hello world')
})

module.exports = router;

Поэтому, если я отправлю запрос с почтальоном по адресу: http://localhost:5000/api/users/, я получу ответ: hello world

Если я ТОЛЬКО изменим конечную точку на что-то вроде /test, я получаю сообщение об ошибке. Другими словами, если я изменю маршрут на:

const express = require('express');
const router = express.Router();

router.get('/test', (req, res) => {
    res.send('hello world')
})

module.exports = router;

и снова отправлю запрос с почтальоном на http://localhost:5000/api/users/test, я получу следующее сообщение об ошибке:

{
    "stringValue": "\"test\"",
    "kind": "ObjectId",
    "value": "test",
    "path": "_id",
    "reason": {},
    "message": "Cast to ObjectId failed for value \"test\" at path \"_id\" for model \"Project\"",
    "name": "CastError"
}

кто-нибудь имеет представление, что происходит? Я не понимаю, почему это не работает ...

РЕДАКТИРОВАТЬ:

Хорошо, так что я понял это, но я все еще не понимаю Не знаю, почему это работает в сценарии 1 и не работает в сценарии 2:

Это работает:

router.get('/test', (req, res) => {
    res.send('hello world')
})

//load project
router.get('/:id', (req, res) => {
    Project.findById(req.params.id)
        .then(projectFound => {
            res.status(200).send(projectFound)
        })
        .catch(err => {
            res.status(500).send(err)
        })
})

Это не работа:

//load project
router.get('/:id', (req, res) => {
    Project.findById(req.params.id)
        .then(projectFound => {
            res.status(200).send(projectFound)
        })
        .catch(err => {
            res.status(500).send(err)
        })
})

router.get('/test', (req, res) => {
    res.send('hello world')
})

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Порядок приоритета контроллеров

:id - это переменная. Когда вы сначала объявляете router.get('/:id', (req, res), ваш метод test никогда не выполняется.

Это потому, что :id принимает значение теста. И вашему коду не нравится идентификатор 'test', поэтому вы получаете ошибку.

Когда вы сначала объявляете другой метод, сначала обнаруживается router.get('/test', а сначала выполняется любой запрос * 1012. *. Все остальные запросы направляются в метод :id.

Ответ на первоначальный вопрос

var express = require('express')
var app = express()

app.get('/test', function (req, res) {
  res.send('HELLO WORLD')
})

Источник

0 голосов
/ 05 февраля 2020

Я получил файл users. js, где я определяю некоторые из моих маршрутов.

Как определяются маршруты?

С учетом сообщения об ошибке, предположительно он ожидает / api / users / {id}, где {id} - число, а не строка типа «test».

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