Ошибка: переданный аргумент должен быть одной строкой из 12 байтов или строкой из 24 шестнадцатеричных символов с неправильным идентификатором. - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь работать с методом NodeJs req.params, но в итоге получаю эту ошибку. Сначала см. Код ниже:

var express = require('express');
require('./db/mongoose');
const User = require('./models/users');
const app = express();
const port = process.env.PORT || 3000;

app.use(express.json());
app.get('/users/:id', (req, res) => {
const _id = req.params.id;
User.findById(_id).then((user) => {
    if (!user) {
        return res.status(404).send();
    }

    res.send(user);
}).catch((e) => {
    console.log(e);
    res.status(500).send();
});
});

После создания запроса в приложении Postman, когда я пытаюсь выполнить запрос, скажем, http://localhost/users/ [какое-то случайное число], он дает мне ошибка «Переданный аргумент должен быть ...», и почтальон выдает мне ошибку 500, где должен выдавать мне 404.

Во-вторых, когда я ввожу идентификатор, который хранится в моей БД, код работает хорошо. Если есть проблема с ObjectId, ошибка должна возникать даже тогда, когда я передаю правильный идентификатор, но это не так.

Node Js version = 8.11.4
MongoDB version = 4.0.5
Mongoose version = 5.9.18

Я был бы признателен, если бы кто-нибудь мог мне здесь помочь.

Обновление: Я заметил (как указал Вишну в ответах ниже), что когда я сохраняю количество символов таким же, как в любом действительном идентификаторе, не имеет значения, если программа не может чтобы найти ID, он будет работать. Если я изменю количество символов, это покажет эту проблему. Итак, я считаю, что сначала мне нужно проверить ObjectId.

Итак, мой вопрос в том, что Mon goose не устраняет эту проблему, автоматически преобразовывая идентификаторы строк в идентификаторы объектов?

1 Ответ

1 голос
/ 18 июня 2020

Похоже, что схема User имеет _id типа ObjectId, и вы передаете случайное число как _id в запрос, который mongoose не может преобразовать его в ObjectId. Это приведет к ошибке приведения, и оператор catch вернет ответ с кодом состояния 500.

Вы можете использовать приведенную ниже функцию, чтобы проверить, является ли _id действительным ObjectId

mongoose.isValidObjectId('some random number')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...