首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在API中包含字段而不添加数据库中的键/val?

如何在API中包含字段而不添加数据库中的键/val?
EN

Stack Overflow用户
提问于 2020-07-29 12:21:40
回答 1查看 1.3K关注 0票数 2

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

我用ApolloServerPrisma做了类似的事情。如果你想知道我做得怎么样?下面是我的设计:

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

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

代码语言:javascript
复制
const Team = {
  slug(parent) {
    return parent.title.replace(/\s+/g, '-').toLowerCase();
  },
};

export { Team as default };

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-06 12:38:35

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

基本上,您正在寻找一个自定义数据响应,很可能与一个自定义端点相结合(因为您不想覆盖现有的端点)。

您可以通过扩展现有的API来实现这一点,让我们对其进行分解:

  1. 添加自定义API端点 a.增加路由 b.添加处理程序 c. 添加权限
  2. 运行一些逻辑
  3. 返回自定义响应

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

代码语言:javascript
复制
./api/{content-type}/config/routes.json

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

代码语言:javascript
复制
{
  "method": "GET",
  "path": "/teams/customData",
  "handler": "team.findCustomHandler",
  "config": {
    "policies": []
  }
}

(B)在下列目录中添加一种方法:

代码语言:javascript
复制
./api/{content-type}/controllers/{Content-Type}.js

就像这样:

代码语言:javascript
复制
'use strict';
module.exports = {
    async findCustomHandler(ctx) {
      //your logic here
    }
};

您可以使用原始的发现方法开始并使用您的逻辑(这是一个很好的例子)添加值:

代码语言:javascript
复制
  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 }));
    }
  }

您可以查看的文档:

扩展模型控制器

欢迎提问

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63153491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档