Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.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
Reactjs AWS API网关中的链请求_Reactjs_Amazon Web Services_Amazon Dynamodb_Aws Api Gateway - Fatal编程技术网

Reactjs AWS API网关中的链请求

Reactjs AWS API网关中的链请求,reactjs,amazon-web-services,amazon-dynamodb,aws-api-gateway,Reactjs,Amazon Web Services,Amazon Dynamodb,Aws Api Gateway,我目前正在创建一个后端带有AWS DynamoDB的网站。我从前端调用AWSAPI网关,该网关运行Lambda函数,然后从DynamoDB获取数据 现在,我定义了一个具有多个属性的“Item”对象,包括一个“Tags”属性。单个项目可以有多个标记。两者都存储在单独的DynamoDB表中,项有一个“Tags”列,其中包含一个tagid数组。每个标记ID链接到标记表中的标记 问题是,如何最好地获取项目及其相应的标记对象 当我从前端运行它时,我调用/items API来获取我想要的项目。在Tags下,

我目前正在创建一个后端带有AWS DynamoDB的网站。我从前端调用AWSAPI网关,该网关运行Lambda函数,然后从DynamoDB获取数据

现在,我定义了一个具有多个属性的“Item”对象,包括一个“Tags”属性。单个项目可以有多个标记。两者都存储在单独的DynamoDB表中,项有一个“Tags”列,其中包含一个tagid数组。每个标记ID链接到标记表中的标记

问题是,如何最好地获取项目及其相应的标记对象

当我从前端运行它时,我调用/items API来获取我想要的项目。在Tags下,我得到了一个tagid数组。我希望这些标记作为实际对象,那么我是否应该调用第二个API调用并用对象替换标记ID数组?我试图找出在这种情况下什么是最佳实践

在我写这篇文章的时候,也许我应该编辑我的Lambda函数来获取项目,以便它包含标记对象

这不是一个完全准确的表达我在做什么,但它应该给你一个正确的想法

功能项(){
const[items,setItems]=useState([]);
useffect(()=>{
异步函数onLoad(){
如果(!props.isAuthenticated){
返回;
}
试一试{
const items=等待加载项();
设置项目(项目);
/*我应该在这里打第二个电话吗*/
}捕获(e){
警报(e);
}
设置加载(假);
}
onLoad();
},[props.isAuthenticated]);
函数loadItems(){
返回API.get('nh','/items');
}
}
Item.propTypes={
itemId:PropTypes.string.isRequired,
名称:PropTypes.string.isRequired,
描述:需要PropTypes.string.isRequired,
类别:PropTypes.string.isRequired,
标记:PropTypes.arrayOf(PropTypes.object)
}

我决定在API级别执行此操作,因为我认为这更像是一种业务逻辑方法。我正在获取的项应该返回标记作为标记对象数组

我需要清理一下,但我就是这么做的

导出异步函数main(事件、上下文){
常量itemParams={
表名:process.env.itemsTable
};
常量tagParams={
表名:process.env.tagsTable
};
试一试{
const itemResult=等待dynamoDbLib.call('scan',itemParams);
const tagResult=等待dynamoDbLib.call('scan',tagParams);
itemResult.Items.forEach(item=>{
/*获取每个项目的标记对象*/
设tagObjects=[];
item.tags.forEach(tag=>{
tagObjects.push(tagResult.Items.filter)(obj=>{
返回obj.tagId==tag;
})[0]);
});
item.tags=标记对象;
});
返回成功(itemResult.Items);
}捕获(e){
返回失败({状态:false});
}
}

那么,运行第二个函数时会发生什么?在那个地方你制造了comment@Amir-Mousavi我还没有实现它,我真的在寻找最好的实现方法。现在我在想,在注释当前所在的位置,创建一个空数组,然后对/tags进行API调用并按ID过滤标记,将它们放入数组中,然后用包含标记对象的新数组替换项上的tagid。因此,考虑到您仅将
isauthentication
作为钩子依赖项,这只适用于
componentDidMount
,此时您需要这些对象(项目和修改的标记)。所以你现在想做的听起来很不错。除非出现我们现在无法预见的另一个问题。顺便说一句,我建议从依赖项中清除
isAuthenticated
,并让路由器负责在未授权呼叫时重定向。