Apollo Server - 在连接器、解析器或模型中解析 REST 结果
Apollo Server - parse REST result in Connector, Resolver or Model
我正在用 Apollo 服务器包装一个旧的 REST API 服务。调用 REST 服务会生成一个 JSON 对象,该对象嵌套了 2 到 3 层深的负载。例如:
{
- MRData: {
- CatTable : {
- Cats : []
更复杂的是,每个资源端点的嵌套模式和节点名称都不同。所以我的问题是,由于每个资源结果都需要自定义操作,所以最好的地方是:在连接器、解析器或模型中。
连接器
如果在连接器中完成,则每个资源都需要一个自定义方法。看起来像很多样板。
public fetchCats(resource: string) {
return new Promise<any>((resolve, reject) => {
request.get(url, (err, resp, body) => {
err ? reject(err) : resolve(JSON.parse(body).MRData.CatTable.Cats)
})
})
}
解析器
解析器方法收到一个承诺,但结果不能被操纵:
const allCats = (_, params, context) => context.cat.getCats()
.then((data) => { // to late to manipulate data here })
型号
该模型看起来很有前途,但不太确定如何构造它:
public getCats() {
const cats = this.connector.fetchCats('/cats.json');
return cats;
}
Apollo 将(通常)与 REST API 集成。我期待着找到处理这种情况的最佳方法。
我通常建议在连接器中进行解析,因为它们应该抽象后端的细节。如果连接器对后端进行抽象,那么从技术上讲,您应该能够在适当的时候将一个后端切换为另一个后端。例如,您可以从查询 REST API 切换到将查询直接发送到有意义的数据库。
这样做的结果是您需要为每个 REST API 构建一个新的连接器,因为没有两个 REST API 是相同的。
我正在用 Apollo 服务器包装一个旧的 REST API 服务。调用 REST 服务会生成一个 JSON 对象,该对象嵌套了 2 到 3 层深的负载。例如:
{
- MRData: {
- CatTable : {
- Cats : []
更复杂的是,每个资源端点的嵌套模式和节点名称都不同。所以我的问题是,由于每个资源结果都需要自定义操作,所以最好的地方是:在连接器、解析器或模型中。
连接器
如果在连接器中完成,则每个资源都需要一个自定义方法。看起来像很多样板。
public fetchCats(resource: string) {
return new Promise<any>((resolve, reject) => {
request.get(url, (err, resp, body) => {
err ? reject(err) : resolve(JSON.parse(body).MRData.CatTable.Cats)
})
})
}
解析器
解析器方法收到一个承诺,但结果不能被操纵:
const allCats = (_, params, context) => context.cat.getCats()
.then((data) => { // to late to manipulate data here })
型号
该模型看起来很有前途,但不太确定如何构造它:
public getCats() {
const cats = this.connector.fetchCats('/cats.json');
return cats;
}
Apollo 将(通常)与 REST API 集成。我期待着找到处理这种情况的最佳方法。
我通常建议在连接器中进行解析,因为它们应该抽象后端的细节。如果连接器对后端进行抽象,那么从技术上讲,您应该能够在适当的时候将一个后端切换为另一个后端。例如,您可以从查询 REST API 切换到将查询直接发送到有意义的数据库。
这样做的结果是您需要为每个 REST API 构建一个新的连接器,因为没有两个 REST API 是相同的。