4. 实现我们的 RESTDataSource
2m

让我们添加这个RESTDataSource 类到我们的项目中。

在终端中,在我们的 server/ 文件夹中,停止我们在项目设置部分启动的当前进程,然后运行:

npm install @apollo/datasource-rest

完成后,使用 npm start 再次启动服务器。

接下来,让我们在 server/src 文件夹中创建一个名为 datasources 的文件夹,所有我们的 将存放在这里。 我们将创建一个名为 track-api.js 的文件。

首先,我们导入我们的 @apollo/datasource-rest 包。

const { RESTDataSource } = require("@apollo/datasource-rest");

这给了我们一个 RESTDataSource 类,我们可以扩展它。

我们将声明一个名为 TrackAPI 的类,它扩展了 RESTDataSource。趁着现在,让我们在忘记之前导出它!

class TrackAPI extends RESTDataSource {
// ...
}
module.exports = TrackAPI;

接下来,让我们为 REST API 赋值 baseURL。此属性用作所有调用的前缀。

class TrackAPI extends RESTDataSource {
baseURL = "https://odyssey-lift-off-rest-api.herokuapp.com/";
}

注意: 确保你的 TrackAPI 类的 baseURL 值以 / 结尾。这将允许我们的辅助类进行请求并将新的路径附加到 baseURL 而不产生任何错误。

代码挑战!

创建一个名为 SpaceCatsAPI 的类,它扩展了 RESTDataSource 类。它的 baseURL 应设置为 https://fake-spacecats-rest-api.cat/。假设 RESTDataSource 类已导入。

让我们在我们的 TrackAPI 类中定义一个名为 getTracksForHome 的方法。 RESTDataSource 类提供HTTP 请求的辅助方法。在我们的例子中,我们要对 tracks 端点执行 GET 请求。然后,我们返回该调用的结果。

getTracksForHome() {
return this.get('tracks');
}

接下来,是时候在我们的 TrackAPI 类中定义 getAuthor 方法了。它接受一个 authorId 作为 并将其用于对 /author/:id 端点的 GET 调用。然后,我们返回该调用的结果。

在我们的 getTracksForHome 方法下方

getAuthor(authorId) {
return this.get(`author/${authorId}`);
}

注意使用反引号 (`) 括起 author/:id 端点,因为我们正在使用字符串插值在末尾添加 authorId

干得好!我们已经设置了我们的 并从 REST API 检索数据。

server/src/datasources/track-api.js
const { RESTDataSource } = require("@apollo/datasource-rest");
class TrackAPI extends RESTDataSource {
baseURL = "https://odyssey-lift-off-rest-api.herokuapp.com/";
getTracksForHome() {
return this.get("tracks");
}
getAuthor(authorId) {
return this.get(`author/${authorId}`);
}
}
module.exports = TrackAPI;
代码挑战!

SpaceCatsAPI 类需要两个方法。第一个方法称为 getSpaceCats。此方法向 spacecats 端点发出 GET 请求并返回结果。第二个方法称为 getMissions。它接受一个 catId 作为参数,并向 spacecats/${catId}/missions 端点发出 GET 请求并返回结果。假设 RESTDataSource 类已导入。

上一步

分享您对本课的疑问和评论

您的反馈将帮助我们改进!如果您遇到困难或困惑,请告诉我们,我们会帮助您解决。所有评论都是公开的,必须遵循 Apollo 行为准则。请注意,已解决或已处理的评论可能会被删除。

您需要一个 GitHub 帐户才能在下方发帖。还没有帐户吗? 请在我们的奥德赛论坛中发帖。