如何在Strapi中创建API获取并存储外部接口数据?
Strapi自定义API实现外部数据缓存逻辑
核心需求
实现一个Strapi API,首次调用时从外部服务拉取数据并存储到本地数据库,后续调用直接返回本地存储的缓存数据。
步骤实现
1. 创建存储外部数据的模型
先在Strapi中创建一个用于存储外部数据的模型(比如命名为external-data),根据外部API返回的数据结构定义对应字段。例如外部API返回文章信息,可定义以下字段:
title(字符串,必填)content(文本)source_id(字符串,唯一,标记外部数据的唯一标识)fetched_at(日期,记录数据拉取时间)
2. 编写自定义API路由
在src/api/external-data/routes/external-data.js中添加路由配置:
module.exports = { routes: [ { method: 'GET', path: '/external-data', handler: 'external-data.fetchOrReturnCached', config: { policies: [], }, }, ], };
3. 实现控制器逻辑
在src/api/external-data/controllers/external-data.js中编写核心逻辑,先检查本地缓存,无数据则拉取外部API并存储:
const axios = require('axios'); module.exports = { async fetchOrReturnCached(ctx) { // 查询本地是否已有存储的数据 const cachedData = await strapi.db.query('api::external-data.external-data').findMany(); if (cachedData.length > 0) { // 有缓存直接返回 return ctx.send({ data: cachedData, message: '返回本地缓存数据' }); } // 无缓存时调用外部API try { const externalResponse = await axios.get('https://外部API地址'); const externalData = externalResponse.data; // 将外部数据批量存入Strapi const storedData = await Promise.all( externalData.map(item => strapi.db.query('api::external-data.external-data').create({ data: { title: item.title, content: item.content, source_id: item.id, fetched_at: new Date() } }) ) ); return ctx.send({ data: storedData, message: '首次拉取并存储外部数据' }); } catch (error) { return ctx.badRequest('拉取外部数据失败', error.message); } } };
原文档关键内容翻译(适配需求部分)
当需要从外部数据源获取数据并集成到Strapi时,核心思路是通过自定义控制器处理数据的拉取与存储逻辑:
- 优先检查本地数据库是否存在目标数据,避免重复调用外部API
- 若本地无数据,使用HTTP客户端(如Axios)请求外部API
- 将获取到的数据转换为Strapi模型所需的格式,存入数据库
- 后续请求直接返回本地存储的数据,提升响应速度并减少外部API依赖
内容的提问来源于stack exchange,提问作者Ugur
相关产品推荐
相关产品推荐

