Javascript .map函数中的异步验证
我正在使用NodeJS、Sequelize和Postgres数据库开发应用程序的后端 注册课程时,用户必须告知哪些组织、公司和教师将链接到该课程 组织ID通过数组传递到后端,我正在尝试进行检查以确保传递的ID存在 到目前为止,我所做的是:Javascript .map函数中的异步验证,javascript,node.js,postgresql,sequelize.js,Javascript,Node.js,Postgresql,Sequelize.js,我正在使用NodeJS、Sequelize和Postgres数据库开发应用程序的后端 注册课程时,用户必须告知哪些组织、公司和教师将链接到该课程 组织ID通过数组传递到后端,我正在尝试进行检查以确保传递的ID存在 到目前为止,我所做的是: const { organizations } = req.body; const organizationsArray = organizations.map(async (organization) => { const organization
const { organizations } = req.body;
const organizationsArray = organizations.map(async (organization) => {
const organizationExists = await Organization.findByPk(organization);
if (!organizationExists) {
return res
.status(400)
.json({ error: `Organization ${organization} does not exists!` });
}
return {
course_id: id,
organization_id: organization,
};
});
await CoursesOrganizations.bulkCreate(organizationsArray);
这有完整的控制器代码,相信会便于理解
什么时候!OrganizationExists是真的,我得到的回报是该组织不存在。问题是,当组织存在时,我得到以下信息。数组.map()返回一个承诺数组,您可以使用Promise.all()
将其解析为一个数组。在映射内部,您应该使用throw new Error()
打破映射-此错误将由Promise.all()
引发,然后您可以捕获它并将错误返回给客户端(或吞下它,等等)
这是您的模式的更正版本,解决了Promise结果
const{organizations}=req.body;
试一试{
//使用Promise.all解析异步回调函数返回的承诺
const organizationsArray=等待承诺(
//这将返回一系列承诺
organizations.map(异步(组织)=>{
const organizationExists=等待组织。findByPk(组织,{
属性:['id'],//我们只需要id
raw:true,//不需要实例
});
如果(!organizationExists){
//不要在映射内发送响应,抛出一个错误以进行爆发
抛出新错误(`Organization${Organization}不存在!`);
}
//它确实存在,因此返回/解析承诺的值
返回{
课程编号:id,
组织\u id:organization,
};
})
);
//如果我们到达这里没有错误,创建记录
等待课程组织。批量创建(组织阵列);
//将成功返回给客户端
返回res.json({success:true});
}捕捉(错误){
//出现错误,请将其返回给客户端
返回res.status(400).json({error:err.message});
}
这是一个重构版本,通过在一个查询中获取所有组织
,然后进行检查/创建课程
插入,速度会快一些
const{Op}=Sequelize;
const{organizations}=req.body;
试一试{
//获取ID的所有组织匹配项
const organizationsArray=wait Organization.findAll({
属性:['id'],//我们只需要id
其中:{
身份证:{
[Op.in]:组织,//其中id位于(组织)
}
},
raw:true,//不需要创建实例
});
//创建我们找到的ID的数组
const foundIds=organizationsArray.map((org)=>org.id);
//检查结果中是否缺少任何ID
if(foundIds.length!==organizations.length){
//使用Array.reduce()找出结果中缺少哪些ID
const missingIds=组织。reduce((missingIds,orgId)=>{
如果(!FoundId.includes(orgId)){
missingIds.push(orgId);
}
返回任务ID;
},[]);//初始化为空数组
抛出新错误(`找不到组织:${missingIds.join(',')}`);
}
//现在创建一个要使用FoundID创建的课程数组
const courses=foundId.map((orgId)=>{
返回{
课程编号:id,
组织id:orgId,
};
});
//如果我们到达这里没有错误,创建记录
等待课程组织。批量创建(课程);
//将成功返回给客户端
返回res.json({success:true});
}捕捉(错误){
//出现错误,请将其返回给客户端
返回res.status(400).json({error:err.message});
}
如果你有一个ID数组,并且你想检查它们是否存在,那么你应该使用(in)操作符,这样你只需点击一次数据库,并在一次点击中获取所有记录(而不是在循环中逐个获取),获得这些记录后,您可以检查它们的长度,以确定它们是否都存在
const{Op}=require(“sequelize”);
let foundOrgs=wait Organization.findAll({
其中:{
身份证:{
[点评]:organizationsArray,
}
}
});
查看一下.map
和异步函数或其他任何问题。