【问题标题】:How to export the value from the promise如何从承诺中导出价值
【发布时间】:2022-01-09 03:58:54
【问题描述】:

我对 node 和 mongoose 还很陌生,我在使用 module.exports 时遇到了一些问题。在尝试使我的代码更干净的同时,我一直在尝试使用模块来获取 mongoDB 查询,因为它们占用了太多空间并且不容易阅读,但是我遇到了一个错误。

我在这里合并 2 个集合以获得结果,但 index.js 上的控制台告诉我未定义。当我在 operations.js 上执行 console.log 然后在索引上执行时,内部的控制台返回数组而不是外部的。

经过一番阅读,我发现这是因为我想要的值在承诺之内,但是我怎样才能得到它呢?

操作.js

const express = require('express')
const mongoose = require('mongoose')

const CheckOutOrder = require('../models/CheckOutOrder')

function ordersQuery(){
    console.log('lol')
    CheckOutOrder.aggregate([
        {
            $match:{
                'is_open':1
            }
        },
        {
            $addFields:{
                'itemToMatch':{
                    $toObjectId:'$idItem'
                }
            }
        },
        {
            $lookup:{
            from: 'e_menu_items',
            localField: 'itemToMatch',
            foreignField: '_id',
            as: 'itemsReceipt'
            }
        },
        {
            $unwind:'$itemsReceipt'
        }
    ]).then(info => {
       console.log(info) 
       return info
    }).catch(e => {
       console.log('e') 
       return e
    })
}

module.exports.totOrders = ordersQuery

index.js

const mongoQueries = require('../mongo/operations')

if(ActionDOM=='test'){
        let orders = []
        orders = mongoQueries.totOrders()
        console.log('------------------------------------------------------')
        console.log(orders)
    }

控制台

lol
------------------------------------------------------
undefined
[
  {
    _id: new ObjectId("61da4036bc966b2a284e8075"),
    idReceipt: 4,
    idUser: '61d1606420f281d51d52e2e1',
    idItem: '61d7f9205bda9c3be60b14ed',
    is_open: 1,
    date_added: 2022-01-09T01:53:58.017Z,
    __v: 0,
    itemToMatch: new ObjectId("61d7f9205bda9c3be60b14ed"),
    itemsReceipt: {
      _id: new ObjectId("61d7f9205bda9c3be60b14ed"),
      menuItem: 'Molletes',
      description: 'Frijoles, queso y salsa',
      price: 18,
      id_cat: 1,
      is_active: 1,
      date_added: 2022-01-07T08:26:08.990Z,
      date_modified: 2022-01-07T08:26:08.990Z,
      __v: 0
    }
  },
  {
    _id: new ObjectId("61da4036bc966b2a284e8079"),
    idReceipt: 4,
    idUser: '61d1606420f281d51d52e2e1',
    idItem: '61d7f9205bda9c3be60b14ed',
    is_open: 1,
    date_added: 2022-01-09T01:53:58.128Z,
    __v: 0,
    itemToMatch: new ObjectId("61d7f9205bda9c3be60b14ed"),
    itemsReceipt: {
      _id: new ObjectId("61d7f9205bda9c3be60b14ed"),
      menuItem: 'Molletes',
      description: 'Frijoles, queso y salsa',
      price: 18,
      id_cat: 1,
      is_active: 1,
      date_added: 2022-01-07T08:26:08.990Z,
      date_modified: 2022-01-07T08:26:08.990Z,
      __v: 0
    }
  }
]

我做错了什么?

【问题讨论】:

  • 你的ordersQuery 没有return 任何东西。在该承诺链前面放置一个 return 关键字。
  • 你不想return e,你想在登录后重新throw

标签: node.js mongoose promise


【解决方案1】:

您可以使用async/await 使代码更“线性”:

async function ordersQuery() {
  console.log('lol');

  try {
    const info = await CheckOutOrder.aggregate([
      {
        $match: {
          is_open: 1,
        },
      },
      {
        $addFields: {
          itemToMatch: {
            $toObjectId: '$idItem',
          },
        },
      },
      {
        $lookup: {
          from: 'e_menu_items',
          localField: 'itemToMatch',
          foreignField: '_id',
          as: 'itemsReceipt',
        },
      },
      {
        $unwind: '$itemsReceipt',
      },
    ]);

    console.log(info);

    return info;
  } catch (e) {
    console.log(e);

    return e;
  }
}

然后也用await调用它(调用函数必须声明async):

async function someFunc(/*....*/) {
  // ...
  
  if (ActionDOM == 'test') {
    let orders = [];
    orders = await mongoQueries.totOrders();
    console.log('------------------------------------------------------');
    console.log(orders);
  }

  // ...
}

【讨论】:

    猜你喜欢
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2017-04-01
    相关资源
    最近更新 更多