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