此功能功能内的控件如何工作?

时间:2019-04-26 08:47:12

标签: node.js mongodb express

我需要编写一个函数,该函数在mongodb中使用_id搜索对象,并且在该对象内部将找到另一个来自不同集合的ID数组, 然后它将使用该ID数组从其他集合中查找名称。

我没有尝试更多的循环,而是直接尝试使用索引进行访问。

Order.findById(orderId)
        .then(order => {
            if(!order){
                    console.log('No Order');
                return next(new Error('No Order Found'));
            }
            console.log(order.productId[0]);
            console.log('reached here 1');
            Product.findById(order.productId[0])
                .then( product => {
                    if(!product){
                        return res.redirect('/admin/create-subadmin');
                    }
                    console.log('inside FindById');
                    const ProductName1 = product.name;
                    console.log(ProductName1);
            })
            .catch(err => console.log(err));        
            console.log('reached here');

         })
         .catch(err => {
             console.log(err);
         });

当前输出:

5cb9e18d6c17f41bacbcdf55 //(id of product[0])
reached here 1 
reached here 
inside FindById 
Titleasd   //(name of of product[0])

我不明白为什么它最后出现在Product.findById中。 即console.log('到达此处'); //此行的执行在Product.findById之前

Scheme of Order
{
    _id: mongoose.Schema.Types.ObjectId,
    orderId:String,
    productId:Array

}
Schema of Product
{

    product_id: {type: Schema.Types.ObjectId,
    },
    title: String,
    name:{
        type: String,
        unique: true,
        required: true
    },
    price:Number
}

我希望函数进入Order->进入productId数组->使用这些ID查找所有产品名称和价格,并将它们存储在对象或数组中的任何内容,但我什至无法理解流程现在控制。

1 个答案:

答案 0 :(得分:0)

关于流程,您错过了一件事。 Product.findById是异步的。因此,当您调用它时,当前函数将不会停止并执行下一行console.log('reached here');

看下面的例子来了解:

这是您的情况

function promise() {
  return new Promise((resolve) => {
    console.log('#1 Start promise function execution');

    setTimeout(() => {
      console.log('#2 Finish promise function execution');

      resolve();
    }, 1500);
  });
}

function test() {
  return new Promise((resolve) => {
    promise()
      .then(() => {
        console.log('#3 After the promise function call');
      })
      .then(resolve);

    console.log('#4 End of all');
  });
}

test();


这是解决方法

function promise() {
  return new Promise((resolve) => {
    console.log('#1 Start promise function execution');

    setTimeout(() => {
      console.log('#2 Finish promise function execution');

      resolve();
    }, 1500);
  });
}

function test() {
  return new Promise((resolve) => {
    promise()
      .then(() => {
        console.log('#3 After the promise function call');
      })
      .then(() => {
        console.log('#4 End of all');
        
        resolve();
      });
  });
}

test();



那您的代码呢?您可以将通话链接

Order.findById(orderId)
  .then((order) => {
    if (!order) {
      console.log('No Order');

      return next(new Error('No Order Found'));
    }

    console.log(order.productId[0]);
    console.log('reached here 1');

    return Product.findById(order.productId[0]);
  })
  .then((product) => {
    if (!product) {
      return res.redirect('/admin/create-subadmin');
    }

    console.log('inside FindById');

    const ProductName1 = product.name;

    console.log(ProductName1);
  })
  .then(() => {
    console.log('reached here');
  })
  .catch(err => {
    console.log(err);
  });