Я пытаюсь сохранить результат 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()
я обновил код
Возможный дубликат Почему моя переменная остается неизменной после того, как я изменил ее внутри функции? - Справочник по асинхронному коду





Сохранить результат 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})
нп. если это решит проблему, отметьте его как правильный ответ или проголосуйте за него.
Поскольку вы хотите что-то запросить в базе данных, это означает, что вы уже создали ее и сохранили в ней некоторые данные.
Однако перед сохранением данных в базе данных вы должны создать свою модель, которая должна быть создана в папке моделей в 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
.
.
}
Наконец, поскольку вы запрашиваете только один объект, вам не нужно его сортировать.
Привет, nilsonjr, для помощи требуется больше контекста. Можете ли вы предоставить все соответствующее содержимое. Было бы полезно увидеть, откуда берется
productи как выглядит схемаproduct.