Получить данные из mongodb с помощью Express Js

мне нужно запустить команду npm npm install express mongoose cors

затем я запускаю базу данных StudentRecords со студентом коллекции, имеющим следующие данные

db.students.insertMany({id:1},{name:'Джон'},{id:2,name:'Доу'});

Я хочу отображать эти данные в своем веб-браузере только с помощью Express, как я это сделал в приведенном ниже коде, но он отображает ошибки (т. е. не извлекает какие-либо данные из базы данных), как исправить код, чтобы он мог работать правильно?

const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');

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

// Middleware
app.use(cors());
app.use(express.json());

// MongoDB connection
mongoose.connect('mongodb://localhost:27017/mydatabase', {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

// Schema and model
const Schema = mongoose.Schema;
const DataSchema = new Schema({
  name: String
});
const Data = mongoose.model('Data', DataSchema);

// Route to fetch data by name and id
app.get('/data/', async (req, res) => {
  try {
    const { name } = req.params;

    const data = await Data.find({ name: name }, { _id: 0, name: 1 });
    if (!data || data.length === 0) {
      return res.status(404).send('Data not found');
    }
    res.json(data);
  } catch (err) {
    console.error('Failed to fetch data', err);
    res.status(500).send('Internal Server Error');
  }
});

// Start server
app.listen(port, () => {
  console.info(`Server running at http://localhost:${port}/`);
});

🤔 А знаете ли вы, что...
JavaScript - это скриптовый язык программирования, разработанный Netscape Communications Corporation.


75
2

Ответы:

В принципе ваш код хорошо настроен.

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

Тестирование в браузере:

Request URL : http://localhost:3000/data/John

Response : 
[
  {
    "name": "John"
  }
]

Прилагаю несколько замечаний и комментариев:

пункт 1:

«…затем я запускаю базу данных StudentRecords с коллекцией Student, имеющей следующие данные db.students.insertMany({id:1},{name:'John'},{id:2,name:'Doe'});...»

наблюдения и комментарии:

Согласно примечанию выше,

database name : studentsRecords
collection name : students // Please note it is not just student alone, s is also suffixed.

Теперь мы создадим документы, как показано ниже:

Предварительные требования: база данных должна указывать на базу данных StudentRecords, а оператор InsertMany должен ссылаться на коллекцию Student. Соответствующие коды приведены ниже.

// start mongo shell
command prompt>mongosh

// check the list of available databases 
mongosh prompt>show dbs

// switch to the database studentsRecords
mongosh prompt>use studentsRecords

// create the documents, please note there should be a set of curly braces to separate each document.
mongosh prompt>db.students.insertMany({id:1,name:'John'},{id:2,name:'Doe'});

// check and verify the documents are created as desired
mongosh prompt>db.students.find();
[
  { _id: ObjectId('6672396e2241632216628d55'), id: 1, name: 'John' },
  { _id: ObjectId('6672396e2241632216628d56'), id: 2, name: 'Doe' }
]

пункт 2:

// соединение с MongoDB mongoose.connect('mongodb://localhost:27017/mydatabase', {useNewUrlParser: true, useUnifiedTopology: true });

Комментарии:

База данных, указанная в строке подключения, должна быть исправлена ​​в соответствии с обсуждениями, которые мы провели в пункте 1. Поэтому исправленный оператор будет таким, как показано ниже. Обратите внимание, что два ключа useNewUrlParser и useUnifiedTopology, переданные в объект параметров, теперь устарели, поэтому теперь они опущены.

…
mongoose.connect('mongodb://localhost:27017/studentsRecords);
…

пункт 3:

… const Data = mongoose.model('Data', DataSchema); …

Комментарии:

Имя коллекции, переданное в модель метода, необходимо изменить с «Данные» на «Студент», это опять же соответствует обсуждению, которое мы провели в пункте 1. Также обратите внимание, что это должно быть единственное имя, поэтому это «студент», а не «студенты». Mongoose автоматически ищет свое имя во множественном числе. Исправленный код приведен ниже:

const Data = mongoose.model(student, DataSchema);

пункт 4:

// Маршрут для получения данных по имени и идентификатору app.get('/data/', async (req, res) => {

Комментарии:

Путь маршрута /data/ также должен иметь префикс параметра маршрута. Это необходимо для получения соответствующего значения, указанного в URL-адресе запроса. Исправленный код приведен ниже.

…
app.get('/data/:name’, async (req, res) => {...

Полный листинг исправленного кода:

const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');

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

// Middleware
app.use(cors());
app.use(express.json());

// MongoDB connection
mongoose.connect('mongodb://localhost:27017/studentsRecords');

// Schema and model
const Schema = mongoose.Schema;
const DataSchema = new Schema({
  name: String,
});

const Data = mongoose.model('student', DataSchema);

// Route to fetch data by name and id
app.get('/data/:name', async (req, res) => {
  try {
    const { name } = req.params;

    const data = await Data.find({ name: name }, { _id: 0, name: 1 });
    if (!data || data.length === 0) {
      return res.status(404).send('Data not found');
    }
    res.json(data);
  } catch (err) {
    console.error('Failed to fetch data', err);
    res.status(500).send('Internal Server Error');
  }
});

// Start server
app.listen(port, () => {
  console.info(`Server running at http://localhost:${port}/`);
});

Решено

Версия 2 кода: добавлен новый путь маршрута для всех.

const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');

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

// Middleware
app.use(cors());
app.use(express.json());

// MongoDB connection
mongoose.connect('mongodb://localhost:27017/test');

// Schema and model
const Schema = mongoose.Schema;
const DataSchema = new Schema({
  name: String,
});
const Data = mongoose.model('student', DataSchema);

// Route to fetch all
// IMPORTANT : keep this route path always on top of the other route path '/data/:name'
// else retrieval will fail.
app.get('/data/all', async (req, res) => {
  try {
    const data = await Data.find({}, { _id: 0, name: 1 });

    if (!data || data.length === 0) {
      return res.status(404).send('Data not found');
    }
    res.json(data);
  } catch (err) {
    console.error('Failed to fetch data', err);
    res.status(500).send('Internal Server Error');
  }
});

// Route to fetch data by name and id
app.get('/data/:name', async (req, res) => {
  try {
    const { name } = req.params;

    const data = await Data.find({ name: name }, { _id: 0, name: 1 });

    if (!data || data.length === 0) {
      return res.status(404).send('Data not found');
    }
    res.json(data);
  } catch (err) {
    console.error('Failed to fetch data', err);
    res.status(500).send('Internal Server Error');
  }
});

// Start server
app.listen(port, () => {
  console.info(`Server running at http://localhost:${port}/`);
});

Интересные вопросы для изучения