首页 > 解决方案 > Mongoose .findByIdAndUpdate() 控制台记录返回但无法分配给属性

问题描述

我编写了这个函数来更新 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 上的值,但没有分配给 property number:。如果我result在控制台日志中返回它完美显示,我不明白发生了什么。我正在使用 Graphql/Mongoose/MongoDB

标签: javascriptmongodbexpressmongoosegraphql

解决方案


它的发生是因为:

  1. genNumber函数没有返回任何东西
  2. 如果genNumber函数返回一些东西,那将是一个承诺,并且需要在创建票证时使用该承诺。

这个更新的代码片段应该可以工作:

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

推荐阅读