无数据库REST API桥:非FHIR转FHIR映射及FHIR工具实现问询
关于无数据库FHIR Bridge API的实现方案
1. node-fhir-server-core 是否适用?
完全可以用!虽然它常被用来构建带数据库的FHIR服务器,但完全适配你这种无数据库的“桥接”场景——核心是它提供了FHIR资源的结构定义、内置验证工具,还有标准化的路由框架,刚好能帮你处理FHIR格式的输出合规性,不用自己从零搭建FHIR的基础架构。
2. 非FHIR到FHIR的映射函数该放哪里?
在node-fhir-server-core的架构里,你可以把映射逻辑放在**自定义服务处理器(service handlers)**中,具体步骤如下:
- 先为你要转换的FHIR资源类型(比如Patient、Observation等)创建对应的服务文件,比如
services/patient.js。 - 在服务的
read、search等方法里,跳过数据库查询步骤,直接调用第三方API获取原始JSON数据,然后在方法内部完成映射转换。 - 举个极简示例:
// services/patient.js module.exports = { read: async (args) => { // 1. 调用第三方API拿到原始数据 const rawPatientData = await fetch(`https://third-party-api/patients/${args.id}`).then(res => res.json()); // 2. 执行非FHIR到FHIR的映射逻辑 const fhirPatient = { resourceType: 'Patient', id: rawPatientData.external_id, name: [{ family: rawPatientData.last_name, given: [rawPatientData.first_name] }], birthDate: rawPatientData.date_of_birth, // 其他字段的映射规则按需补充... }; // 3. 返回转换后的FHIR资源,框架会自动处理响应格式 return fhirPatient; } };
- 最后在FHIR服务器的配置文件里注册这个服务,框架会自动把对应的FHIR标准路由(比如
/Patient/:id)绑定到这个处理器上。
3. 如果不用node-fhir-server-core,纯Express怎么实现?
如果想完全自定义,纯Express也能搞定,核心要解决两个核心问题:FHIR资源验证和标准化响应格式:
- FHIR验证:可以用
fhir-validator或hl7-fhir-validator这类npm包,它们能根据FHIR官方Schema验证你的转换结果是否合规。示例:
const { validate } = require('fhir-validator'); const express = require('express'); const app = express(); // 自定义映射函数 const mapRawToFHIR = (rawData) => { return { resourceType: 'Patient', id: rawData.external_id, name: [{ family: rawData.last_name, given: [rawData.first_name] }] // 其他字段映射... }; }; app.get('/Patient/:id', async (req, res) => { try { // 获取原始数据并转换 const rawData = await fetch(`https://third-party-api/patients/${req.params.id}`).then(res => res.json()); const fhirPatient = mapRawToFHIR(rawData); // 验证FHIR资源(指定使用的FHIR版本,比如R4) const validationResult = await validate(fhirPatient, 'R4'); if (!validationResult.isValid) { // 按照FHIR规范返回错误响应(用OperationOutcome资源) return res.status(400).json({ resourceType: 'OperationOutcome', issue: validationResult.errors.map(err => ({ severity: 'error', code: 'invalid', details: { text: err.message } })) }); } // 返回合规的FHIR响应 res.json(fhirPatient); } catch (err) { res.status(500).json({ resourceType: 'OperationOutcome', issue: [{ severity: 'error', code: 'exception', details: { text: err.message } }] }); } });
- 标准化路由和响应:手动实现FHIR的标准路由(比如
/Patient、/Observation等),并严格按照FHIR规范处理成功/错误响应,比如用OperationOutcome资源返回错误信息。 - 可以封装一个独立的映射工具类,把不同资源类型的转换逻辑分开,保持代码的可维护性。
内容的提问来源于stack exchange,提问作者Barjuan Davis
相关产品推荐
相关产品推荐

