You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sequelize查询返回字段访问报错:undefined is not an object (evaluating 'item.Attraction.Name')

问题:无法访问接口返回的Attraction.Name属性

后端Get接口代码

app.get('/attraction/:routeid', async(req,res)=>{
    let response = await attraction_routes.findAll({
        attributes: ['attractionId'],
        where:{routeid: req.params.routeid},
        raw: true,
        include: [{
            model: Attraction,
            required: true,
            attributes: ['Name','Desc','Address']
        }],
        order: [['id', 'ASC']]
    });
    res.json(response)
});

接口返回的JSON数据

[
   {
      "attractionId":1,
      "Attraction.Name":"Mirante Cerro Santa Lucia"
   },
   {
      "attractionId":2,
      "Attraction.Name":"Cajon del Maipo"
   }
]

前端渲染代码

function renderPost(item){
return(
  <View style={styles.card}>
    <Text style={styles.title}>
      {item.Attraction.Name}
    </Text>
  </View>
)
};

错误信息

undefined is not an object (evaluating 'item.Attraction.Name')


问题原因

后端查询时设置了raw: true,Sequelize会将关联模型的属性打平为Attraction.Name这种字符串形式的键,而非嵌套的Attraction对象。因此前端尝试访问item.Attraction.Name时,item.Attraction是undefined,自然会报错。

解决办法

办法1:修改后端查询(推荐)

移除raw: true配置,让Sequelize返回嵌套的对象结构,这样前端就能正常通过item.Attraction.Name访问属性:

app.get('/attraction/:routeid', async(req,res)=>{
    let response = await attraction_routes.findAll({
        attributes: ['attractionId'],
        where:{routeid: req.params.routeid},
        // 移除raw: true
        include: [{
            model: Attraction,
            required: true,
            attributes: ['Name','Desc','Address']
        }],
        order: [['id', 'ASC']]
    });
    res.json(response)
});

修改后接口返回的JSON结构变为:

[
   {
      "attractionId":1,
      "Attraction": {
          "Name":"Mirante Cerro Santa Lucia"
      }
   },
   {
      "attractionId":2,
      "Attraction": {
          "Name":"Cajon del Maipo"
      }
   }
]

办法2:前端直接访问扁平属性

如果不想改动后端,前端可以通过字符串键的方式直接访问打平后的属性:

function renderPost(item){
return(
  <View style={styles.card}>
    <Text style={styles.title}>
      {item["Attraction.Name"]}
    </Text>
  </View>
)
};

内容的提问来源于stack exchange,提问作者thiago.ramos208

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:10:22