如何使用nodejs将结果保存在findOne()Mongoose的变量中

时间:2019-06-13 01:59:10

标签: node.js function mongoose promise

我正在尝试保存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()调用

3 个答案:

答案 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
.
.
}

最后,由于您仅查询一个对象,因此无需对其进行排序。