Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用node js将数据保存到mongodb后返回2个数组_Node.js_Mongodb - Fatal编程技术网

Node.js 如何使用node js将数据保存到mongodb后返回2个数组

Node.js 如何使用node js将数据保存到mongodb后返回2个数组,node.js,mongodb,Node.js,Mongodb,我需要以下代码的帮助。我从客户端获得一个项目数组,然后目标是将它们保存在mongodb中,并返回分类为“已保存”和“失败”项目的列表。失败项目的示例是在唯一属性上重复的项目 我知道下面的代码将无法工作,因为范围可变。我怎样才能避开它?下面的代码为savedItems和failedItems返回一个空数组。谢谢 router.post('/addItems', async (req, res, next) => { let items = req.body; let result =

我需要以下代码的帮助。我从客户端获得一个项目数组,然后目标是将它们保存在mongodb中,并返回分类为“已保存”和“失败”项目的列表。失败项目的示例是在唯一属性上重复的项目

我知道下面的代码将无法工作,因为范围可变。我怎样才能避开它?下面的代码为savedItems和failedItems返回一个空数组。谢谢

router.post('/addItems', async (req, res, next) => {
  let items = req.body;
  let result = {
    savedItems: [],
    failedItems: []
  };

  function saveData() {
    for (i = 0; i < items.length; i++) {
      item = items[i];

      Model.create({ ...item }, (err, data) => {
        if (err) {
          result.failedItems.push(item);
        } else {
          result.savedItems.push(item);
        }
      });
    }
    return result;
  }

  saveData().then(result => {
    res.send({
      results: result
    });
  });
});
router.post('/addItems',异步(req,res,next)=>{
让项目=需求主体;
让结果={
savedItems:[],
failedItems:[]
};
函数saveData(){
对于(i=0;i{
如果(错误){
结果.failedItems.push(项目);
}否则{
result.savedItems.push(项目);
}
});
}
返回结果;
}
saveData()。然后(结果=>{
res.send({
结果:结果
});
});
});

您的saveData方法没有返回承诺,请尝试此操作

function saveData() {
  return new Promise(resolve => {
    let items = req.body;
    let result = {
      savedItems: [],
      failedItems: []
    };
    let promises = [];
    for (i = 0; i < items.length; i++) {
      item = items[i];
      let promise = new Promise(resolve => {
        Model.create({ ...item }, (err, data) => {
          if (err) {
            result.failedItems.push(item);
          } else {
            result.savedItems.push(item);
          }
          resolve();
        });
      });
      promises.push(promise);
    }
    Promise.all(promises).then(() => resolve(result));
  })
}
函数saveData(){
返回新承诺(解决=>{
让项目=需求主体;
让结果={
savedItems:[],
failedItems:[]
};
让承诺=[];
对于(i=0;i{
Model.create({…item},(err,data)=>{
如果(错误){
结果.failedItems.push(项目);
}否则{
result.savedItems.push(项目);
}
解决();
});
});
承诺。推动(承诺);
}
承诺。所有(承诺)。然后(()=>解决(结果));
})
}
router.post('/addItems',异步(req,res,next)=>{
//使用异步时使用try-catch
试一试{
让项目=需求主体;
让结果={
savedItems:[],
failedItems:[]
};
for(设i=0;i
@GMKaiRoger这是因为Model.create是异步的,请检查我的更新答案。
router.post('/addItems', async (req, res, next) => {
// use try catch when use async
try {
    let items = req.body;
    let result = {
        savedItems: [],
        failedItems: []
    };

    for (let i = 0; i < items.length; i++) {
        const item = items[i];
        // use the returned promise instead of callback for Model.create 
        const data = await Model.create({ ...item });
        result.savedItems.push(item);

        // if also need to handle failed item in result use anathor try catch inside
        /*try {
            const data = await Model.create({ ...item });
            result.savedItems.push(item);
        } catch( err ) {
            result.failedItems.push(item);
        }*/
    }
    res.send({
        results: result
    });
} catch( err ) {
    // To all the errors unexpected errors + thrown rejected promises
    res.send({
        error: err
    });
}
});