uni-app 关联查询后结果内对象格式错误

发布于 1周前 作者 ionicwang 来自 Uni-App

uni-app 关联查询后结果内对象格式错误

操作步骤:

预期结果:

nearTargets: [
{
target_id:"{
_id:"xxx",
xx:"xxx"
}",
distance:10,
difficulty:20
},
{
target_id:"{
_id:"xxx",
xx:"xxx"
}",
distance:10,
difficulty:20
}
]

实际结果:

nearTargets: {
target_id:[]
}

bug描述:

主表内的字段类型为数组,数组元素类型为object,object内元素关联副表_id字段。 主表内此字段定义如下:

"nearTargets":{  
    "bsonType": "array",  
    "arrayType": "object",  
    "required": [  
        "target_id","distance"  
    ],  
    "permission":{  
        "write":false  
    },  
    "properties": {  
        "target_id": {  
            "bsonType": "string",  
            "foreignKey": "pms-target-list._id"  
        },  
        "distance": {  
            "bsonType": "int",  
        },  
        "difficulty": {  
            "bsonType": "int",  
        }  
    }  
},

查询代码

let mkTemp = db.collection('主表名').where("_id=='"+id+"'")  
    .getTemp()  
db.collection(mkTemp, 'pms-target-list')  
    .get()  
    .then((res) => {  
        console.log(res);

结果内此字段格式和数据如下:

nearTargets: {
target_id:[]
}

结果格式错误,nearTargets应该是一个数组,每个元素应该为一个对象。而且结果数据为空,但实际表里有数据。


3 回复

文档上没有这种 properties 里面套 properties 的写法


bsonType是Object,Object里面有关联字段,这种是没有问题的。这种数组内是object应该也要支持呀。而且如果不支持,那也应该报错,不应该返回错误的结果。

uni-app 中进行关联查询时,如果查询结果中的对象格式出现错误,可能是由于以下几个原因导致的:

1. 数据结构问题

确保你在查询时正确关联了表,并且返回的数据结构符合预期。如果关联查询返回的字段名与前端期望的字段名不一致,可能会导致格式错误。

解决方案:

  • 检查 SQL 查询语句,确保字段名正确。
  • 在查询结果返回前端之前,进行数据格式的转换或映射。

示例:

SELECT a.id, a.name, b.address
FROM users a
JOIN addresses b ON a.id = b.user_id

在返回结果之前,可以将其转换为前端需要的格式:

const result = queryResult.map(item => ({
  id: item.id,
  name: item.name,
  address: item.address
}));

2. JSON 序列化问题

如果查询结果在传输过程中需要进行 JSON 序列化,确保序列化后的数据格式正确。

解决方案:

  • 检查后端返回的 JSON 数据格式,确保没有多余的字段或格式错误。
  • 使用 JSON.parseJSON.stringify 进行数据格式的转换。

示例:

const jsonData = JSON.stringify(queryResult);
const parsedData = JSON.parse(jsonData);

3. 前端数据处理问题

在前端接收到数据后,可能需要对数据进行进一步处理,以确保格式正确。

解决方案:

  • 检查前端代码,确保在处理数据时没有错误。
  • 使用 console.log 或调试工具检查数据格式。

示例:

onLoad() {
  uni.request({
    url: 'https://example.com/api/data',
    success: (res) => {
      console.log(res.data); // 检查数据格式
      this.dataList = res.data.map(item => ({
        id: item.id,
        name: item.name,
        address: item.address
      }));
    }
  });
}

4. 数据库字段类型问题

如果数据库中的字段类型与前端期望的类型不一致,可能会导致格式错误。

解决方案:

  • 检查数据库字段类型,确保与前端期望的类型一致。
  • 在查询时进行类型转换。

示例:

SELECT CAST(a.id AS CHAR) AS id, a.name, b.address
FROM users a
JOIN addresses b ON a.id = b.user_id

5. ORM 框架问题

如果你使用了 ORM 框架(如 Sequelize、TypeORM 等),确保在定义模型时字段类型和关联关系正确。

解决方案:

  • 检查 ORM 模型定义,确保字段类型和关联关系正确。
  • 在查询时使用正确的关联方法。

示例(Sequelize):

const User = sequelize.define('user', {
  id: { type: Sequelize.INTEGER, primaryKey: true },
  name: Sequelize.STRING
});

const Address = sequelize.define('address', {
  userId: Sequelize.INTEGER,
  address: Sequelize.STRING
});

User.hasMany(Address, { foreignKey: 'userId' });
Address.belongsTo(User, { foreignKey: 'userId' });

User.findAll({
  include: [Address]
}).then(users => {
  console.log(users);
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!