我正在使用graphql、Vue.js和apollo
这是我的DateBank
const sensorsdb = [
{
name: "sensor 1",
id: "s-1",
timestamp: 1582021371,
value: 100
},
{
name: "sensor 1",
id: "s-1",
timestamp: 1579451703,
value: 150
},
{
name: "sensor 2-1",
id: "s-2-1",
timestamp: 1582021371,
value: 200
},
{
name: "sensor 2-2",
id: "s-2-2",
timestamp: 1579451703,
value: 350
},
{
name: "sensor 2-2",
id: "s-2-2",
timestamp: 1582021371,
value: 300
},
{
name: "sensor 3",
id: "s-3",
timestamp: 1582021371,
value: 400
},];我想根据对象id获取所有对象。sensorId是一个数组。因为我想获得具有多个ids的多个对象。
下面是我获取object的API函数。
async getDataById({ sensorId }) {
let sensorsData = [];
for (let i = 0; i < sensorId.length; i++) {
let sensorData = this.sensorDataStore.sensors.filter(sensor => sensor.id === sensorId[i]);
sensorsData = sensorsData.concat(sensorData);
}
return sensorsData;
}在前端,gql文件如下:
query sensorData($id: [String]){
sensorData(id: $id){
name
id
value
timestamp
}}在vue.js中使用我的apollo查询代码,在本例中,selectedSensorId是"s-2-1“、"s-2-2”
<ApolloQuery :query="require('../graphql/sensorDataById.gql')" :variables="{ id: selectedSensorId }">
<template v-slot="{ result: { loading, error, data } }">
<b-loading :is-full-page=true :active.sync=loading :can-cancel="false"/>
<div v-if="error">
<no-data-error />
</div>
<div v-if="data">
{{ data }}
<bar-chart-view :sensorInfo="data.sensorData"/>
</div>
</template>
</ApolloQuery>但我得到了以下不同的结果: Graphql游乐场有正确的结果,前端结果与重复传感器-s-2


发布于 2020-02-20 03:17:20
阿波罗客户端根据in the docs中描述的id和__typename字段对结果进行标准化。如果一个数组返回多个具有相同id的项,默认情况下它们将共享相同的缓存键,这意味着客户端返回的将是相同的对象。
您应该为您的InMemoryCache构造函数提供一个定制的dataIdFromObject函数,以适应您的特定用例。类似于:
const dataIdFromObject = object => {
switch (object.__typename) {
case 'SensorDataPoint': return `SensorDataPoint:${object.id}:{value}`;
default: return defaultDataIdFromObject(object);
}
}请注意,如果您在其他地方使用相同的类型,您可能会遇到缓存在突变后正确更新的问题,因为我们现在同时关闭了value和id。您可能需要考虑一种不同的模式方法,其中ids实际上是唯一的:
type SensorDataPoint {
id: ID!
sensorId: ID!
sensorName: String!
value: Int!
timestamp: Int!
}甚至更好
type SensorDataPoint {
id: ID!
value: Int!
timestamp: Int!
sensor: Sensor!
}
type Sensor {
id: ID!
name: String!
}https://stackoverflow.com/questions/60306341
复制相似问题