nodejs集合上的多个异步操作

时间:2016-11-03 08:15:25

标签: node.js mongodb express

我正在构建一个nodejs应用程序,我对nodejs异步模型很新。

问题是我已修改数据库集合以包含字符串字段,而sill引用另一个集合,即我已修改车辆模型以包含名为make name的额外字段作为字符串字段,而不是仅仅引用make集合为了提高效率,我已经完成了这种去标准化,因为这个字段经常被读不写。

摘自数据库架构:

<View style={{flex:1,backgroundColor:'white'}}>
  <View style={{justifyContent:'space-around'}}>
    <View style={{height:50,alignSelf:'stretch',backgroundColor:'pink',margin:5}}/>  
    <View style={{height:50,alignSelf:'stretch',backgroundColor:'pink',marginHorizontal:5}}/>  
    <View style={{height:50,alignSelf:'stretch',backgroundColor:'pink',margin:5}}/>  
  </View>
  <View style={{flex:1,alignItems:'center',justifyContent:'center',alignSelf:'stretch',backgroundColor:'blue',margin:5}}>
    <Text style={{color:'white',fontWeight:'bold'}}>
      View
    </Text>
  </View>
</View>

以下是make schema的摘录:

var vehicleSchema  = new mongoose.Schema({
stringId: String,
make: {
        type: mongoose.Schema.Types.ObjectId, ref:"Make",
        makeText: String
    },

});

问题是我已经在集合中有一些数据,我需要编写一个代码来循环遍历车辆集合中的车辆,然后查找车辆的make对照制作集合,然后找到相应的制造商名称string并将该值赋给vehicle.make.makeText

我做了大量的研究,我到达了asyn模块,下面是我为解决这个问题而编写的代码:

var makeSchema = new mongoose.Schema({
name: String,
models: [modelSchema]

遗憾的是,代码似乎只执行一次而且我没有看到vehicle.save方法的效果,因为我无法看到对DB的更改。

提前致谢

2 个答案:

答案 0 :(得分:1)

我认为你没有使用eachOfSeries http://caolan.github.io/async/docs.html#eachOfSeries

  

应用于coll中每个项目的函数。关键是物品的钥匙,   或者在数组的情况下索引。 iteratee传递了一个   回调(err),一旦完成就必须调用。如果没有错误   已经发生,回调应该没有参数或运行   显式null参数。使用(item,key,callback)调用。

你得到一个密钥,而不是完整的对象,必须调用回调。

答案 1 :(得分:0)

你忘记了next()函数,你需要在findById返回后调用它。没有运行此修复,但它显示了 问题是

>    // code to loop through all records in vehicles collection and add
> makeText vehicle.find({},(err,allVehicles) =>{
> 
>        console.log("executed vehicle.find()");
>        async.eachOfSeries(allVehicles,function(vehicle,next){
>            console.log(vehicle.stringId);
>            make.findById(vehicle.make.id,function(err,foundMake){
>                vehicle.make.makeText = foundMake.name;
>                console.log(foundMake.name);
>                vehicle.save(function(err,saved){
>                    if(err){
>                        console.log(err.message);
>                        next(err)
>                    }else{
>                        next();
>                    }
> 
>                })
>            })
> 
>        },function(err){
>            if (err){
>                console.log(err.message);
>         }
> 
>        }
> 
> )});