是否有可能将原始物体放在trapi的定制端点上?

时间:2019-10-03 14:06:44

标签: strapi

我正在Strapi上构建自定义端点。对于此端点,我需要具有原始内容。是否可以从ctx变量中获取它?

stripe : async(ctx) => {
    // Handle the event
    const sig = ctx.request.headers['stripe-signature']

    const event = null
    try {
      // ctx.request.body needs to be the original raw body
      event = stripe.webhooks.constructEvent(ctx.request.body,sig, endpointSecret)
    }catch (e) {
      ctx.badRequest(null,e)
      return
    }

4 个答案:

答案 0 :(得分:1)

创建一个中间件( /config/middleware.js )并将其更新为以下版本

module.exports = {
  settings: {
    cors: {
      enabled: true,
    },
    parser: {
      enabled: true,
      multipart: true,
      includeUnparsed: true,
    },
  },
};

在控制器中(/api//controllers/.js):

const unparsed = require("koa-body/unparsed.js");
const unparsedBody = ctx.request.body[unparsed];

答案 1 :(得分:0)

我不确定您的需求。

ctx.request.body包含您请求的原始正文。

之后,如果要发送事件作为响应正文,则可以这样进行。 ctx.body = event;

以及代码中的警告。您为const编写了一个event定义,并为您分配了event您的bandi webhook结果。您必须定义一个let变量。

答案 2 :(得分:0)

它实际上是通过在请求环境配置(config / environments / development / request.json-> parser.includedUnparsed:true)中打开“ includesUnparsed”来工作的。

您可以使用koa-body内置功能来访问未解析的身体:

某些应用程序需要对请求主体进行低温图形验证,例如,来自松弛或条带的webhook。如果koa-body选项中的includeUnparsed为true,则可以访问未分析的主体。启用后,从unparsed = require('koa-body / unparsed.js')导入用于访问请求正文的符号,或使用unparsed = Symbol.for('unparsedBody')定义自己的访问器。然后,可以使用ctx.request.body [unparsed]获得未解析的正文。

koa-body docs

答案 3 :(得分:0)

官方koa-bodyparser软件包实际上是开箱即用的。参见:https://github.com/koajs/bodyparser#raw-body

这是一个小例子:

import Koa from 'koa';
import KoaRouter from '@koa/router';
import koaBodyParser from 'koa-bodyparser';

const app = new Koa();
const router = new KoaRouter();

const stripeCheckout = (ctx, next) => {
  const sig = ctx.request.header['stripe-signature'];
  
  let event;
  
  if (!process.env.STRIPE_ENDPOINT_SECRET) {
    throw new Error('Missing Stripe endpoint secret.');
  }
  
  try {
    event = stripe.webhooks.constructEvent(
      ctx.request.rawBody,
      sig,
      endpointSecret: process.env.STRIPE_ENDPOINT_SECRET
    );
  } catch (err) {
    logger('error', err);
    
    ctx.status = 400;
    ctx.body = `Webhook Error: ${err.message}`;
    
    return next();
  }
  
  // ... do something with the event
  
  if (event.type === 'checkout.session.completed') {
    const session = event.data.object;
    
    // ... do something with the checkout session
  }
  
  // return a response to acknowledge receipt of the event
  ctx.status = 200;
  ctx.body = { received: true };
  
  return next();
};

// POST
router.post('/stripe-checkout', stripeCheckout);

app.use(koaBodyParser());

app.use(router.routes());
app.use(router.allowedMethods());

app.listen(port, () => {
  logger('log', `✅  Done! Server is listening on http://localhost:${port}`);
});