Как сохранить результат в переменной findOne() Mongoose с помощью nodejs

Я пытаюсь сохранить результат findOne(), однако понятия не имею, как сохранить этот результат в переменной.

function createSubscription (req, res, next) {
  let product_id = "P-5JM98005MT260873LLT44E2Y" ;
  let doc = null;
  product.findOne({"plans.id": product_id}, { "plans.$": 1 
  }).sort({create_time: -1}).exec(function(err, docs) {  
    if (err) {
    } else {
      if (docs != null) {
        this.doc = docs;
      } 
    }
  });
  console.info(doc);
  let result = null;
  if (doc.create != null) {
    result = processDoc(doc);
  }
}

function processDoc(doc) {
   //do something 
  return resul;
}

function processResult(result) {
  //do something
}


Ниже я копирую схему продукта

const mongoose = require('mongoose');

const Schema = mongoose.Schema;
const ProductSchema = new Schema({
    id: {
        type: String,
        trim: true,
        required: true,
    },
    name: {
        type: String,
        required: true,
    },
    description: {
        type: String,
        required: true,
    },
    create_time: {
        type: Date,
        required: true,
    }
});
module.exports = mongoose.model('Product', ProductSchema);

Документ всегда имеет значение null и не получает значение.

В общих чертах, я хотел бы получить ответ product.findOne для использования другой функции, вызываемой с помощью createSubscription()

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

dillon 13.06.2019 04:52

я обновил код

nilsonjr 13.06.2019 05:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
2 119
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Сохранить результат findOne() так же просто:

var doc = product.findOne();

Проблема, с которой вы столкнулись, заключается в том, что вы вызываете processDoc() до завершения findOne(). Посмотрите на асинхронный javascript. Вы можете исправить это, используя async/await следующим образом:

async function createSubscription (req, res, next) {
    var doc = await product.findOne();
    processDoc(doc);
}

Причина в том, что вы вызываете функцию обратного вызова, что означает, что функция асинхронна. Таким образом, нет гарантии, что ваш запрос будет выполнен и значения будут установлены до того, как он достигнет,

  if (doc.create != null) {
    result = processDoc(doc);
  }

Чтобы решить эту проблему, вы можете использовать синтаксис Async/Await:

const createSubscription = async function (params) { 
    try {  return await User.findOne(params)
    } catch(err) { console.info(err) }
}

const doc = createSubscription({"plans.id": product_id})

нп. если это решит проблему, отметьте его как правильный ответ или проголосуйте за него.

Anjana 13.06.2019 06:24

Поскольку вы хотите что-то запросить в базе данных, это означает, что вы уже создали ее и сохранили в ней некоторые данные.

Однако перед сохранением данных в базе данных вы должны создать свою модель, которая должна быть создана в папке моделей в Product.js (названия моделей по соглашению должны начинаться с заглавной буквы). Затем вам нужно ИМПОРТировать его на странице выше, чтобы получить к нему доступ. Вы хотите сделать запрос по product.id, но по идентификатору какого продукта?

Поскольку у вас есть req в вашей функции, это означает, что вы что-то публикуете. Если вы установите правильные настройки в app.js, вы сможете получить доступ к req.body, которая представляет собой информацию, публикуемую на стороне клиента.

app.js //настройка для разбора (чтения или доступа) req.body

app.use(express.json());
app.use(express.urlencoded({ extended: false }));

Теперь мы можем добраться req.body.id

это должен быть ваш код:

function createSubscription (req, res, next) {
const product=Product.findOne({plan.id:req.body.id})
.
.
}

Если вы заметили, я не взял этот план.id в кавычки. Потому что метод findOne() принадлежит модели Товар, а эта модель принадлежит пакету, который вы используете. (В мангусте вы запрашиваете без кавычек, в клиенте mongodb вы запрашиваете в кавычках)

findOne() — это асинхронная операция, то есть результат придет к вам не сразу. Поэтому вы всегда должны хранить его в блоке Попробуйте поймать.

function createSubscription (req, res, next) {
try{
const product=Product.findOne({plan.id:req.body.id})
}
catch(error){console.info(error.message)} //every error object has message property
.
.
}

Наконец, поскольку вы запрашиваете только один объект, вам не нужно его сортировать.

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