我正在尝试保存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);
该文档始终为null,并且不会接收该值。
总的来说,我想让响应product.findOne使用另一个函数,通过createSubscription()调用
答案 0 :(得分:0)
要保存findOne()的结果非常简单:
var doc = product.findOne();
您遇到的问题是,在findOne()完成之前要调用processDoc()。查看异步javascript。您可以这样使用async / await来解决此问题:
async function createSubscription (req, res, next) {
var doc = await product.findOne();
processDoc(doc);
}
答案 1 :(得分:0)
原因是您正在调用回调函数,这意味着该函数是异步的。因此,不能保证您的查询会执行,并且值会在到达之前进行设置,
if (doc.create != null) {
result = processDoc(doc);
}
要解决此问题,您可以使用异步/等待语法:
const createSubscription = async function (params) {
try { return await User.findOne(params)
} catch(err) { console.log(err) }
}
const doc = createSubscription({"plans.id": product_id})
答案 2 :(得分:0)
由于您要查询数据库中的某些内容,这意味着您已经创建了一个内容并在其中保存了一些数据。
但是,在将数据保存到数据库之前,您应该创建模型,该模型应该在Product.js的models文件夹下创建(模型名称应按惯例以大写字母开头)。然后,您必须在上面的页面中导入它才能访问它。您要按product.id查询,但要查询哪个产品的ID?
由于您的函数中有req
,这意味着您要发布内容。如果您在app.js中设置了正确的设置,则应该可以访问req.body
,这是客户端发布的信息。
app.js //设置解析(读取或访问)请求正文
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
.
.
}
最后,由于您仅查询一个对象,因此无需对其进行排序。