Как сохранить результат в переменную findOne () Mongoose с помощью nodejs - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь сохранить результат 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.log(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);

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

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

Ответы [ 3 ]

0 голосов
/ 13 июня 2019

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

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

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

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

const doc = createSubscription({"plans.id": product_id})
0 голосов
/ 13 июня 2019

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

Однако перед сохранением данных в базе данных вы должны создать свою модель, которая должна быть создана в папке моделей в 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})
.
.
}

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

findOne() - это асинхронная операция, означающая, что результат не придет к вам сразу.Поэтому вы всегда должны хранить его в блоке try / catch .

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

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

0 голосов
/ 13 июня 2019

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

var doc = product.findOne();

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

async function createSubscription (req, res, next) {
    var doc = await product.findOne();
    processDoc(doc);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...