首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我从Graphql游乐场和前端得到不同的结果

我从Graphql游乐场和前端得到不同的结果
EN

Stack Overflow用户
提问于 2020-02-20 01:46:35
回答 1查看 418关注 0票数 0

我正在使用graphql、Vue.js和apollo

这是我的DateBank

代码语言:javascript
复制
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函数。

代码语言:javascript
复制
  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文件如下:

代码语言:javascript
复制
query sensorData($id: [String]){
sensorData(id: $id){
    name
    id
    value
    timestamp
}}

在vue.js中使用我的apollo查询代码,在本例中,selectedSensorId是"s-2-1“、"s-2-2”

代码语言:javascript
复制
<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

EN

回答 1

Stack Overflow用户

发布于 2020-02-20 03:17:20

阿波罗客户端根据in the docs中描述的id__typename字段对结果进行标准化。如果一个数组返回多个具有相同id的项,默认情况下它们将共享相同的缓存键,这意味着客户端返回的将是相同的对象。

您应该为您的InMemoryCache构造函数提供一个定制的dataIdFromObject函数,以适应您的特定用例。类似于:

代码语言:javascript
复制
const dataIdFromObject = object => {
  switch (object.__typename) {
    case 'SensorDataPoint': return `SensorDataPoint:${object.id}:{value}`;
    default: return defaultDataIdFromObject(object);
  }
}

请注意,如果您在其他地方使用相同的类型,您可能会遇到缓存在突变后正确更新的问题,因为我们现在同时关闭了valueid。您可能需要考虑一种不同的模式方法,其中ids实际上是唯一的:

代码语言:javascript
复制
type SensorDataPoint {
  id: ID!
  sensorId: ID!
  sensorName: String!
  value: Int!
  timestamp: Int!
}

甚至更好

代码语言:javascript
复制
type SensorDataPoint {
  id: ID!
  value: Int!
  timestamp: Int!
  sensor: Sensor!
}

type Sensor {
  id: ID!
  name: String!
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60306341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档