Mongoose .findByIdAndUpdate() 控制台记录返回但无法分配给属性

Posted

技术标签:

【中文标题】Mongoose .findByIdAndUpdate() 控制台记录返回但无法分配给属性【英文标题】:Mongoose .findByIdAndUpdate() console log the return but can't assign to a property 【发布时间】:2020-05-02 21:04:14 【问题描述】:

我写了这个函数来更新 MongoDB 中的数据:

const Sequence = require('../models/sequenceSchema');

module.exports.genNumber = function () 
    let doc = Sequence.findByIdAndUpdate(
        _id: "5e1f72951c9d440000afce53",
        $inc:sequence_value: 1,
        new: true,
        function(err,result)
            if(err) return console.log(err)


            return result.sequence_value;
        
    )
;

在 Mutation resolve 我写了这段代码:

const graphql = require('graphql');
const functions = require('../modules/functions');

const Mutation = new GraphqlObjectType(
(..)
resolve(parent,args)
                let ticket = new Ticket(
                    name: args.name,
                    number: functions.genNumber(),                        
                    opendate: Date(),
                    product: args.product,
                    priority: args.priority,
                    status: args.status,
                    deadline: calcs.deadline(Date(),args.priority),
                    userid: args.userid
                );

我的问题是函数 findByIdAndUpdate() 更新了 MongoDB 上的值,但没有分配给属性 number:。如果我在控制台日志中返回result,它会完美显示,我不明白发生了什么。我正在使用 Graphql/Mongoose/MongoDB

【问题讨论】:

你能试试这个吗 :: module.exports.genNumber = (req, done) => Sequence.findByIdAndUpdate( _id: "5e1f72951c9d440000afce53" , $inc: sequence_value: 1 , new: true , function (err, result) if (err) console.log(err), done(err) ; done(null, result.sequence_value) ) ; @srinivasy 它抛出一个错误说TypeError: done is not a function 【参考方案1】:

之所以会这样,是因为:

    genNumber 函数没有返回任何内容 如果genNumber 函数返回某些内容,这将是一个承诺,并且需要在创建票证时使用该承诺。

这个更新的代码 sn-p 应该可以工作:

const Sequence = require('../models/sequenceSchema');

module.exports.genNumber = function () 
  // Notice the return statement below
  return new Promise((resolve, reject) => 
    Sequence.findByIdAndUpdate(
       _id: "5e1f72951c9d440000afce53" ,
       $inc:  sequence_value: 1  ,
       new: true ,
      function (err, result) 
        if (err) 
          console.log(err);
          return reject(err);
        
        console.log('Result: ', result);
        return resolve(result.sequence_value);
      
    )
  )
;

=

const Mutation = new GraphqlObjectType(
  // (..)
  // Notice the resolve method becomes an asynchronous
  resolve: async (parent, args) => 
    // Notice the await on functions.genNumber call
    const number = await functions.genNumber();
    let ticket = new Ticket(
      name: args.name,
      number: number,
      opendate: Date(),
      product: args.product,
      priority: args.priority,
      status: args.status,
      deadline: calcs.deadline(Date(), args.priority),
      userid: args.userid
    );
  
)

【讨论】:

await functions.genNumber(); 正在返回整个查询而不是 result.sequence_value。这真的让我头疼 是的,我想我知道为什么仍然会发生这种情况。您需要承诺化 genNumber 方法。我更新了代码 sn-p。

以上是关于Mongoose .findByIdAndUpdate() 控制台记录返回但无法分配给属性的主要内容,如果未能解决你的问题,请参考以下文章

mongoose入门以及 mongoose 实现数据 的增删改查

mongoose使用之查询篇

Mongoose 错误 - 具有相同型号名称的 Mongoose 型号

使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起

使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起

??node.js????Mongoose??????