【问题标题】:How to save the result in variable of findOne() Mongoose using nodejs如何使用nodejs将结果保存在findOne()Mongoose的变量中
【发布时间】:2019-10-27 13:42:45
【问题描述】:

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

【问题讨论】:

标签: node.js function mongoose promise


【解决方案1】:

既然您想查询数据库中的某些内容,这意味着您已经创建了一个并在其中保存了一些数据。

但是,在将数据保存到数据库之前,您应该创建模型,该模型应该在 Product.js 中的模型文件夹下创建(模型名称应按照惯例以大写字母开头)。然后你必须在上面的页面中导入它才能访问它。您想通过 product.id 查询,但要查询哪个产品的 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
.
.
}

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

【讨论】:

    【解决方案2】:

    原因是你正在调用一个回调函数,这意味着函数是异步的。所以不能保证你的查询会执行并且值会在到达之前设置,

      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})
    

    【讨论】:

    • np。如果它解决了问题,请将其标记为正确答案或投赞成票。
    【解决方案3】:

    保存 findOne() 的结果就这么简单:

    var doc = product.findOne();
    

    您遇到的问题是您在 findOne() 完成之前调用 processDoc() 。查看异步 javascript。你可以像这样使用 async/await 来解决这个问题:

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

    【讨论】:

      猜你喜欢
      • 2022-12-08
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多