Найдите и распечатайте имя элементов с помощью MongoDB и Mangoose с помощью Node.js затем отключитесь от сервера

#node.js #mongodb #mongoose

Вопрос:

Я использую MongoDB с мангустом, я создал коллекцию фруктов, и я хочу распечатать названия фруктов, а затем отключиться от сервера

 const mongoose = require('mongoose');
mongoose.connect("mongodb://localhost:27017/fruitsDB", {
  useNewUrlParser: true
});

const fruitSchema = new mongoose.Schema({ //schema: come vogliamo che gli eleemnti vengano sturtturati
  name: String,

  rating: {
    type: Number,
    min: 1,
    max: 10
  },
  review: String
});

//creiamo un modulo
const Fruit = mongoose.model("Fruit", fruitSchema);

const fruit = new Fruit({
  name: "Apple",
  rating: 8,
  review: "good"
});
//fruit.save();
const kiwi = new Fruit({
  name: "Kiwi",
  rating: 10,
  review: "great"
});

Fruit.find(function(err, fruits) {
  if (err) {
    console.log(err);
  } else {
    mongoose.connection.close();
    fruits.forEach(function(fruit) {
      console.log(fruit.name);
    });
  }
});

 

Я написал это в app.js затем я скомпилировал его с помощью команды «узел app.js»
Терминал выдает мне это:

Яблоко Яблоко Яблоко Яблоко Киви

(узел:24352) Необработанный promiserejection Предупреждение: Ошибка mongoexpiredsession: Не удается использовать сеанс, завершившийся в Object.applySession (C:UsersFederDesktopudemymongooseFruitnode_modulesmongoosenode_modulesmongodblibsessions.js:647:16) при подключении.команда (C:UsersFederDesktopudemymongooseFruitnode_modulesmongoosenode_modulesmongodblibcmapconnection.js:185:36) в C:UsersFederDesktopudemymongooseFruitnode_modulesmongoosenode_modulesmongodblibsdamserver.js:176:18 на объекте.обратный вызов (C:UsersFederDesktopudemymongooseFruitnode_modulesmongoosenode_modulesmongodblibcmapconnection_pool.js:266:13) в C:UsersFederDesktopudemymongooseFruitnode_modulesmongoosenode_modulesmongodblibcmapconnection_pool.js:474:29 в C:UsersFederDesktopudemymongooseFruitnode_modulesmongoosenode_modulesmongodblibcmapconnection_pool.js:402:13 при обратном вызове (C:UsersFederDesktopudemymongooseFruitnode_modulesmongoosenode_modulesmongodblibcmapconnect.js:52:9)в C:UsersFederDesktopudemymongooseFruitnode_modulesmongoosenode_modulesmongodblibcmapconnect.js:124:13 в MessageStream.обработчик сообщений (C:UsersFederDesktopudemymongooseFruitnode_modulesmongoosenode_modulesmongodblibcmapconnection.js:479:9) в MessageStream.emit (events.js:400:28) (Используйте node --trace-warnings ... , чтобы показать, где было создано предупреждение) (узел:24352) Предупреждение о необработанном обещании: Необработанное отклонение обещания. Эта ошибка возникла либо в результате включения асинхронной функции без блока catch, либо в результате отклонения обещания, которое не было обработано с помощью .catch(). Чтобы завершить процесс узла при отклонении необработанного обещания, используйте флаг CLI --unhandled-rejections=strict (см. https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (идентификатор отклонения: 1) (узел:24352) [DEP0018] Предупреждение об устаревании: Необработанные отклонения обещаний считаются устаревшими. В будущем отказы в обещаниях, которые не будут обработаны, приведут к прекращению Node.js процесс с ненулевым кодом выхода.

Ответ №1:

Прежде всего, вам нужно сначала сохранить свои модели в базе данных.

Во-вторых, похоже, что вы используете find метод неправильно.

 const fruit = new Fruit({
  name: "Apple",
  rating: 8,
  review: "good"
});

fruit.save();

const kiwi = new Fruit({
  name: "Kiwi",
  rating: 10,
  review: "great"
});

kiwi.save();

Fruit.find({}).then((fruits) => {         
    mongoose.connection.close();
    fruits.forEach(function(fruit) {
      console.log(fruit.name);
    });
});
 

Также я бы предложил использовать async/await для улучшения читаемости кода.

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

1. «Во-вторых, похоже, что вы неправильно используете метод поиска». что вы имеете в виду?

2. Я имею в виду, что параметры неверны. Вы всегда должны передавать первый параметр, объект фильтра. Если мой ответ решил вашу проблему, пожалуйста, отметьте его как правильный.

3. это создает ту же проблему

4. Хорошо, я изменил свой ответ, попробуйте еще раз. Теперь он использует обещания вместо обратных вызовов.

Ответ №2:

Вы можете попробовать что-то в этом роде:

 const fruits = await Fruit.find({})
// do whatever you want with fruits
mongoose.connection.close();
 

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