【问题标题】:How to include a field in API without adding the key/val in database?如何在 API 中包含字段而不在数据库中添加键/值?
【发布时间】:2020-11-19 00:53:32
【问题描述】:

我正在寻找一种 Strapi API 返回键/值对的方法,该键/值对被计算并添加到服务器响应中,但不从数据库中获取:

我已经使用ApolloServerPrisma 完成了类似的操作。如果你想知道我是怎么做到的?然后这是我的设置:

注意:我不是在寻找 slug 在 Strapi 中的功能,但总的来说,我想知道如何将动态/计算字段添加到 Strapi API 服务器响应中。

文件:./src/resolvers/Team.js

const Team = {
  slug(parent) {
    return parent.title.replace(/\s+/g, '-').toLowerCase();
  },
};

export { Team as default };

文件:./src/resolvers/index.js

import { extractFragmentReplacements } from 'prisma-binding';
import Query from './Query';
import Mutation from './Mutation';
import Team from './Team';

const resolvers = {
  Query,
  Mutation,

  // static
  Team,
};

const fragmentReplacements = extractFragmentReplacements(resolvers);
export { resolvers, fragmentReplacements };

文件:./src/prisma.js

import { Prisma } from 'prisma-binding';
import { fragmentReplacements } from './resolvers/index';

require('dotenv').config({ path: './.env' });

const prisma = new Prisma({
  typeDefs: 'src/generated/prisma.graphql',
  endpoint: process.env.API_URL,
  secret: process.env.PRISMA_MANAGEMENT_API_SECRET,
  fragmentReplacements,
});

export { prisma as default };

文件:./src/schema.graphql

type Team {
  id: ID!
  title: String!
  color: String!
  slug: String! // this is not in Db but taken care by `./src/resolvers/StaticTeam.js`
}

正如您在上面看到的,我是如何获得slug 的,尽管它不在数据库中。我只是想将 key:val 添加到我的 API 中。

【问题讨论】:

  • 您能否添加所需功能的示例?即带有发送参数和结果的端点路径/名称
  • @ghosh,这都是实验性的,我没有任何端点,但这是我需要的:{ id: 1, title: 'My Title', color: '#fff', slug: 'my-title' // this is not in Db but sever should send data in response }
  • @ghosh 正如你所建议的那样,我加入了 Slack 小组,但还没有得到任何回应:(

标签: javascript api rest graphql strapi


【解决方案1】:

我想知道如何将动态/计算字段添加到 Strapi API Server 响应中

基本上您正在寻找Custom data response,很可能与自定义端点相结合(因为您不想覆盖现有端点)。

您可以通过扩展现有 API 来做到这一点,让我们分解一下:

  1. 添加自定义 API 端点
    一种。添加路由
    湾。添加处理程序
    C。 Add permissions
  2. 运行一些逻辑
  3. 返回自定义响应

(1) 要将自定义 API 端点添加到用户定义的内容类型,您需要 (a) 在以下目录中添加路由:

./api/{content-type}/config/routes.json

像这样(在路由数组中):

{
  "method": "GET",
  "path": "/teams/customData",
  "handler": "team.findCustomHandler",
  "config": {
    "policies": []
  }
}

(b)在以下目录中添加一个方法:

./api/{content-type}/controllers/{Content-Type}.js

像这样:

'use strict';
module.exports = {
    async findCustomHandler(ctx) {
      //your logic here
    }
};

您可以使用原始的 find 方法开始并使用您的逻辑添加您的值 (this is a great example):

  async find(ctx) {
    let entities;
    if (ctx.query._q) {
      entities = await strapi.services.team.search(ctx.query);
    } else {
      entities = await strapi.services.team.find(ctx.query);
    }
    // TODO: add your extra calculated value
    return entities.map(entity => {
    // You can do this here
    sanitizeEntity(entity, { model: strapi.models.restaurant }));
    }
  }

您可以查看的文档:
Extending a Model Controller

欢迎提问

【讨论】:

    猜你喜欢
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2022-01-17
    • 2013-06-22
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    相关资源
    最近更新 更多