Не удается получить элемент по айди с MongoDB

Рейтинг: 0Ответов: 1Опубликовано: 19.03.2023

Первый раз залажу в дела с базами, проблема заключается в том, что не могу получить определенный элемент с полного джсона db.js:

const { MongoClient } = require('mongodb');

const URL = "mongodb://localhost:27017/moviebox";
let dbConnection;

const presets = {
    serverSelectionTimeoutMS: 5000,
    maxPoolSize: 10,
    serverSelectionTimeoutMS: 5000,
    socketTimeoutMS: 45000,
    family: 4
}

module.exports = {
    connectToDb: (cb) => {
        MongoClient.connect(URL, presets)
            .then((client) => {
                 console.log('Connected to MongoDB');
                 dbConnection = client.db();
                 return cb();
            })
            .catch((err) => {
                return cb(err);
            });
    },
    getDb: () => dbConnection,
};

server.js:

const express = require('express');
const { ObjectId } = require('mongodb');
const { connectToDb, getDb } = require('./db');

const PORT = 3000;

const app = express();

let db;

connectToDb((err) => {
    if (!err) {
        app.listen(PORT, (err) => {
            err ? console.log(err) : console.log(`listening port ${PORT}`);
        });
        db = getDb();
    } else {
        console.log(`DB connection error: ${err}`);
    }
});

const handleError = (res, error) => {
    res.status(500).json({ error });
}

app.get('/movies', (req, res) => {
    const movies = [];

    db
         .collection('movies')
         .find()
         .sort({ title: 1 })
         .forEach((movie) => movies.push(movie))
        .then(() => {
             res
                .status(200)
                .json(movies);
        })
        .catch(() => handleError(res, "Something goes wrong..."));
 });

app.get('/movies/:id', (req, res) => {
    if (ObjectId.isValid(req.params.id)) {
         db
            .collection('movies')
            .findOne({ _id: ObjectId(req.params.id) })
            .then((doc) => {
                res
                    .status(200)
                    .json(doc);
            })
            .catch(() => handleError(res, "Something goes wrong..."));
    } else {
        handleError(res, "Wrong id");
    }
});

Ошибка

То есть если обращаться по урлу /movies/ выводит всё и четко, но вот если обращаться по айдишнику вылазит такая ошибка. Подскажите варианты решения

Ответы

▲ 0

Решение лежит в ошибке. Там говориться, что ObjectId - это конструктор и не может быть вызван без оператора new.

Рабочий код:

const express = require('express');
const { ObjectId } = require('mongodb');
const { connectToDb, getDb } = require('./db');

const PORT = 3000;

const app = express();

let db;

connectToDb((err) => {
    if (!err) {
        app.listen(PORT, (err) => {
            err ? console.log(err) : console.log(`listening port ${PORT}`);
        });
        db = getDb();
    } else {
        console.log(`DB connection error: ${err}`);
    }
});

const handleError = (res, error) => {
    res.status(500).json({ error });
}

app.get('/movies', (req, res) => {
    const movies = [];

    db
         .collection('movies')
         .find()
         .sort({ title: 1 })
         .forEach((movie) => movies.push(movie))
        .then(() => {
             res
                .status(200)
                .json(movies);
        })
        .catch(() => handleError(res, "Something goes wrong..."));
 });

app.get('/movies/:id', (req, res) => {
    if (ObjectId.isValid(req.params.id)) {
         db
            .collection('movies')
            .findOne({ _id: new ObjectId(req.params.id) })
            .then((doc) => {
                res
                    .status(200)
                    .json(doc);
            })
            .catch(() => handleError(res, "Something goes wrong..."));
    } else {
        handleError(res, "Wrong id");
    }
});