Получить данные из 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}/`);
});

Какие ошибки?

Carcigenicate 18.06.2024 23:55

Синтаксис insertMany для добавления данных в коллекцию students выглядит неправильно.

prasad_ 19.06.2024 05:05

Вы уверены, что читаете информацию из коллекции students в приложении ExpressJS?

prasad_ 19.06.2024 05:09
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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}/`);
});

выдает ошибку Данные не найдены

philomath 19.06.2024 08:16

Пожалуйста, поделитесь URL-адресом запроса, который вы пробовали, я имею в виду вот так localhost:3000/data/John. Наряду с этим, пожалуйста, поделитесь результатами этого шага или командой mongosh Prompt>db.students.find();

WeDoTheBest4You 19.06.2024 08:18

Привет, проблема все еще сохраняется.

WeDoTheBest4You 20.06.2024 02:55

теперь работает localhost:3000/data/John. , затем предположим, что я хочу запросить все имена, а не только одно имя, например Джон, что-то вроде этого localhost:3000/data (отобразить все данные)

philomath 20.06.2024 06:27

Спасибо. Ваше подтверждение побудит других также использовать этот контент.

WeDoTheBest4You 20.06.2024 06:55

«... тогда предположим, что я хочу запросить все...»: добавлен новый маршрут для всех данных, см. обновленный ответ.

WeDoTheBest4You 20.06.2024 07:20

это не работает,

philomath 21.06.2024 23:03

Да, пропустил, Извините, сейчас добавил. Пожалуйста, посмотрите второй ответ. Первый ответ: не вносятся поправки.

WeDoTheBest4You 22.06.2024 02:53
Ответ принят как подходящий

Версия 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}/`);
});

как я могу использовать одну и ту же логику для вставки, обновления и удаления?

philomath 22.06.2024 09:33

Идея остается той же. В настоящее время он работает для функции просмотра. В настоящее время доступен для просмотра обработчик маршрута. И этот обработчик маршрута имеет модель мангуста для выполнения работы с базой данных. Это все в двух словах. Теперь предположим, что для вставки должен быть другой обработчик маршрута, и внутри этого обработчика должна быть операция модели мангуста. Вот и все. Начните писать что-нибудь в этих строках, а потом пробуйте. Будут проблемы или ошибки, пишите в комментариях. Поможет.

WeDoTheBest4You 22.06.2024 09:41

Привет, мой предыдущий комментарий помог тебе? Есть ли что-нибудь еще, чтобы сделать для этого?

WeDoTheBest4You 27.06.2024 04:57

Привет. Удалось ли вам разработать другие маршруты?

WeDoTheBest4You 16.07.2024 11:11

не, я пробовал, но не помогло... где я могу поделиться кодом? чтобы вы могли просмотреть их на предмет улучшения

philomath 18.07.2024 09:27

Без вопросов. Оцените вашу попытку. Если у вас есть тестовый репозиторий на GitHub, загрузите его туда и укажите путь к репозиторию. Если нет, я предоставлю его, вы можете загрузить его.

WeDoTheBest4You 18.07.2024 09:29

если да, позвольте мне погрузиться в github, а затем я поделюсь путем к репозиторию здесь, в комментариях.

philomath 18.07.2024 09:36

Другие вопросы по теме