Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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
Javascript .map函数中的异步验证_Javascript_Node.js_Postgresql_Sequelize.js - Fatal编程技术网

Javascript .map函数中的异步验证

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

我正在使用NodeJS、Sequelize和Postgres数据库开发应用程序的后端

注册课程时,用户必须告知哪些组织、公司和教师将链接到该课程

组织ID通过数组传递到后端,我正在尝试进行检查以确保传递的ID存在

到目前为止,我所做的是:

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
和异步函数或其他任何问题。