如何在graphql-fhir中执行实例查询?

时间:2019-04-01 20:28:53

标签: hl7-fhir graphql-fhir

此问题是从我们Github account上的一个问题迁移而来的,因为我们希望其他人都可以得到答案。这是原始问题:

你好

以下是我尝试过的InstanceQuery

Forest

我收到的回覆为Leaf

那我应该尝试哪种正确格式?

https://build.fhir.org/graphql.html的样本为http://localhost:3000/3_0_1/Questionnaire/jamana/$graphql?query={id}。它在其服务器上工作。当我在graphql-fhir中尝试类似操作时,我无法得到响应。

1 个答案:

答案 0 :(得分:0)

Github的原始答案:

由于我们使用express-graphql,所以我们使用命名查询。我认为这不是有效的语法。另外,提供的网址似乎不起作用,我只是得到一个OperationOutcome,说该患者不存在,这不是有效的GraphQL响应。

您可以尝试从以下位置更改查询吗?

http://localhost:3000/3_0_1/Questionnaire/jamana/$graphql?query={id}

对此:

http://localhost:3000/3_0_1/Questionnaire/jamana/$graphql?query={Questionnaire{id}}

编写查询时,您需要在实例查询中提供返回类型。您应该得到一个类似于以下内容的响应(如果您已经实现了解析器,那么您将获得数据,而不是null):

{
  "data": {
    "Questionnaire": {
      "id": null
    }
  }
}

以及后来的评论:

如果获取的是null,则说明您正确执行了此操作,但是尚未编写查询或将其连接到数据源。您仍然需要在解析器中退回问卷。

看到的地方:

instance: {
    name: 'Questionnaire',
    path: '/3_0_1/Questionnaire/:id',
    query: QuestionnaireInstanceQuery,
},

您会看到正在使用id参数注册端点,该参数与GraphQL参数不同。这只是一个明确的论点。如果导航到questionnaire/query.js文件,则可以看到QuestionnaireInstanceQuery查询的解析器与标准QuestionnaireQuery不同。因此,在您的questionnaire/resolver.js文件中,如果要使查询和实例查询都起作用,则需要实现两个解析器。

例如

// This is for the standard query
module.exports.getQuestionnaire = function getQuestionnaire(
    root,
    args,
    context = {},
    info,
) {
    let { server, version, req, res } = context;
    // Do query and return questionnaire 
    return {};
};

// This one is for a questionnaire instance
module.exports.getQuestionnaireInstance = function getQuestionnaireInstance(
    root,
    args,
    context = {},
    info,
) {
    let { server, version, req, res } = context;
    // req.params.id is your questionnaire id, use that for your query here
    // queryQuestionnaireById does not exist, it is pseudo code
    // you need to query your database here with the id
    let questionnaire = queryQuestionnaireById(req.params.id);
    // return the correct questionnaire here, default returns {}, 
    // which is why you see null, because no data is returned
    return questionnaire;
};