账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    mongoose返回的数据解构失败.
    65
    0

    业务场景1: 自定义返回的数据格式

    async function testPromise() {
      const promiseName = new Promise(resolve => {
        resolve({ name: 'xiaobe' });
      });
      const promiseAge = new Promise(resolve => {
        resolve({ age: '22' });
      });
      const result = await Promise.all([promiseName, promiseAge]);
      const [name, age] = result;
      // return result;
      return {
        ...name,
        ...age,
      };
    }
    
    async function test() {
      const res = await testPromise();
      console.log('res', res);
    }
    
    test()
    
    /**
    * 输出:
    * res { name: 'xiaobe', age: '22' }
    */

    业务场景2: 返回mongoose查询mongodb返回的数据

    // mongodb数据库数据格式
    {
        "_id": ObjectId("5de62a3aa1b4c42f7fb66d05"),
        "currentProgress": 10
    }
    
    // 获取数据
    function fetchClockDay() {
      return new Promise((resolve, reject) => {
        ClockDayModel.findOne({}, { _id: 0 }, (err, res) => {
          if (err) {
            reject(err);
          }
          resolve(res); // 返回格式为{ "currentProgress": 10 }
        });
      });
    }
    
    // 请求
    async function fetch() {
      const result = await Promise.all([
        fetchDailyDoneNum(),
        fetchDailyDoneProgress(),
        fetchClockDay(),
      ]);
      const [doneNum, doneProgress, clockDay] = result;
      return { doneNum, doneProgress, ...clockDay };
    }
    
    /**
    * 输出:
    * res { doneNum: { doneTaskNum: 10, allTaskNum: 100 },
      doneProgress: { currentProgress: 10 },
      '$__':
       InternalCache {
         strictMode: true,
         selected: { _id: 0 },
         shardval: undefined,
         saveError: undefined,
         validationError: undefined,
         adhocPaths: undefined,
         removing: undefined,
         inserting: undefined,
         saving: undefined,
         version: undefined,
         getters: {},
         _id: undefined,
         populate: undefined,
         populated: undefined,
         wasPopulated: false,
         scope: undefined,
         activePaths:
          StateMachine { paths: {}, states: [Object], stateNames: [Array] },
         pathsToScopes: {},
         cachedRequired: {},
         session: undefined,
         '$setCalled': Set {},
         ownerDocument: undefined,
         fullPath: undefined,
         emitter:
          EventEmitter {
            _events: [Object: null prototype] {},
            _eventsCount: 0,
            _maxListeners: 0 },
         '$options': { skipId: true, isNew: false, willInit: true } },
      isNew: false,
      errors: undefined,
      _doc: { clockDay: 10 },
      '$locals': {},
      '$init': true }
    */

    解构部分数据被转换,不清楚是因为什么?

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 不灭戾天 普通会员 1楼

      在Mongoose中,返回的数据应该是一个对象,如果你返回的是一个数组,那么你可能需要重新定义你的查询来避免数组索引问题。例如:

      javascript var user = await User.find({});

      如果你返回的是一个对象,你可以通过设置toArray()方法来解构它:

      javascript var user = await User.find({}); user = user.toArray();

      如果你不确定数据的类型,你可以先使用JSON.stringify()方法将其转换为字符串,然后再使用JSON.parse()方法将其转换回数据类型:

      javascript var user = await User.find({}); user = JSON.stringify(user); var user = JSON.parse(user);

      如果你遇到的错误是TypeError: Cannot read property 'find' of undefined,那么你可能需要确保你的查询是正确的,或者你可能需要检查你的数据是否已经被正确地存储和处理。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部