首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义用户控制器方法未被strapi调用

自定义用户控制器方法未被strapi调用
EN

Stack Overflow用户
提问于 2020-10-11 12:14:51
回答 1查看 936关注 0票数 0

因此,我正在使用strapi为一个项目构建一个网站后端。网站后端的要求是,有一个电子商务组件必须包括在内,因为客户想要做订单处理,并处理信用卡交易使用条纹。如上所述,我决定为在strapi的用户权限插件下创建的用户帐户编写一个自定义控制器。这样,我就可以将来自strapi的用户帐户链接到stripe端的相应客户帐户。

然而,我遇到了一个特别的问题。我为创建和更新用户而编写的自定义用户控制器方法似乎可以按预期工作。不过,每当我删除用户时,strapi似乎根本没有使用我为删除用户而编写的自定义方法。我甚至包含了一个console.log调用,但是没有弹出任何东西。

我真的不确定如何修复这个问题,因为我看不到任何日志调用,而且当发生这种情况时,strapi似乎也没有发出任何错误。任何关于如何解决这个问题的建议都是值得感谢的。

这是我正在处理的自定义控制器。

<project_dir>/extensions/user-permissions/controllers/User.js

代码语言:javascript
复制
'use strict';

/**
 * A set of functions called "actions" for `user`
 */

const _ = require('lodash'),
      { sanitizeEntity } = require('strapi-utils'),
      stripe = require('stripe')('<SK_HERE>'),
      sanitizeUser = (user) => sanitizeEntity(user, {model: strapi.query('user', 'users-permissions').model}),
      formatError = (error) => [{ messages: [{ id: error.id, message: error.message, field: error.field }] }];

module.exports = {
  async create(ctx) {
    const advanced = await strapi.store({
      environment: '',
      type: 'plugin',
      name: 'users-permissions',
      key: 'advanced'
    }).get();

    const { email, username, firstName, lastName, password, role } = ctx.request.body;

    if (!email) return ctx.badRequest('missing.email');
    if (!username) return ctx.badRequest('missing.username');
    if (!password) return ctx.badRequest('missing.password');
    if (!firstName) return ctx.badRequest('missing.firstName');
    if (!lastName) return ctx.badRequest('missing.lastName');

    const userWithSameUsername = await strapi
      .query('user', 'users-permissions')
      .findOne({ username });

    if (userWithSameUsername) {
      return ctx.badRequest(
        null,
        formatError({
          id: 'Auth.form.error.username.taken',
          message: 'Username already taken.',
          field: ['username'],
        })
      );
    }

    if (advanced.unique_email) {
      const userWithSameEmail = await strapi
        .query('user', 'users-permissions')
        .findOne({ email: email.toLowerCase() });

      if (userWithSameEmail) {
        return ctx.badRequest(
          null,

          formatError({
            id: 'Auth.form.error.email.taken',
            message: 'Email already taken.',
            field: ['email'],
          })
        );
      }
    }

    const user = {
      ...ctx.request.body,
      provider: 'local',
    };

    user.email = user.email.toLowerCase();

    if (!role) {
      const defaultRole = await strapi
        .query('role', 'users-permissions')
        .findOne({ type: advanced.default_role }, []);

      user.role = defaultRole.id;

    }

    try {
      const customer = await stripe.customers.create({name: `${firstName} ${lastName}`, email: email});

      user.stripeId = customer.id;
      
      const data = await strapi.plugins['users-permissions'].services.user.add(user);

      ctx.created(sanitizeUser(data));

    } catch (error) {
      ctx.badRequest(null, formatError(error));

    }

  },
  async update(ctx) {
    const advancedConfigs = await strapi.store({
      environment: '',
      type: 'plugin',
      name: 'users-permissions',
      key: 'advanced',
    }).get();

    const { id } = ctx.params;
    const { email, username, password, firstName, lastName} = ctx.request.body;

    const user = await strapi.plugins['users-permissions'].services.user.fetch({id});

    if (_.has(ctx.request.body, 'email') && !email) {
      return ctx.badRequest('email.notNull');
    }

    if (_.has(ctx.request.body, 'username') && !username) {
      return ctx.badRequest('username.notNull');
    }

    if (_.has(ctx.request.body, 'firstName') && !firstName) {
      return ctx.badRequest('firstName.notNull');
    }

    if (_.has(ctx.request.body, 'lastName') && !lastName) {
      return ctx.badRequest('lastName.notNull');
    }

    if (_.has(ctx.request.body, 'password') && !password && user.provider === 'local') {
      return ctx.badRequest('password.notNull');
    }

    if (_.has(ctx.request.body, 'username')) {
      const userWithSameUsername = await strapi
        .query('user', 'users-permissions')
        .findOne({ username });

      if (userWithSameUsername && userWithSameUsername.id != id) {
        return ctx.badRequest(
          null,
          formatError({
            id: 'Auth.form.error.username.taken',
            message: 'username.alreadyTaken.',
            field: ['username'],
          })
        );
      }
    }

    if (_.has(ctx.request.body, 'email') && advancedConfigs.unique_email) {
      const userWithSameEmail = await strapi
        .query('user', 'users-permissions')
        .findOne({ email: email.toLowerCase() });

      if (userWithSameEmail && userWithSameEmail.id != id) {
        return ctx.badRequest(
          null,
          formatError({
            id: 'Auth.form.error.email.taken',
            message: 'Email already taken',
            field: ['email'],
          })
        );
      }
      ctx.request.body.email = ctx.request.body.email.toLowerCase();
    }

    let updateData = {
      ...ctx.request.body,
    };

    if (_.has(ctx.request.body, 'password') && password === user.password) {
      delete updateData.password;
    }

    if(email != null || firstName != null || lastName != null) {
      let stripeUpdate = {};

      if(email != null && (email !== user.email)) stripeUpdate = {...stripeUpdate, email: email};
      if((firstName != null && (firstName !== user.firstName)) || (lastName != null && (lastName !== user.lastName))) stripeUpdate = {
        ...stripeUpdate,
        name: `${firstName != null && (firstName !== user.firstName) ? firstName : user.firstName} ${lastName != null && (lastName !== user.lastName) ? lastName : user.lastName}`
      };

      if(Object.keys(stripeUpdate).length > 0) {
        const customerUpdate = await stripe.customers.update(user.stripeId, stripeUpdate);

      }

    }

    const data = await strapi.plugins['users-permissions'].services.user.edit({ id }, updateData);

    ctx.send(sanitizeUser(data));
  },
  async destroy(ctx) {
    console.log('test...');
    const { id } = ctx.params,
          user = await strapi.plugins['users-permissions'].services.user.fetch({id}),
          customerDelete = await stripe.customers.del(user.stripeId),
          data = await strapi.plugins['users-permissions'].services.user.remove({id});

    ctx.send(sanitizeUser(data));

  }
};
EN

回答 1

Stack Overflow用户

发布于 2020-10-14 05:16:38

您是否在user-permissions中激活了销毁操作?

我已经在<project_dir>/extensions/user-permissions/controllers/中用这个简单的User.js测试了它

代码语言:javascript
复制
module.exports = {
    async find(ctx) {
        console.log('find!!!');

        return [];
    },
    async destroy(ctx) {
        console.log('destroy!!!');

        return [];
    },
}

当我向http://localhost:1337/users/1234发送DELETE请求时调用console.log('destroy!!!')

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

https://stackoverflow.com/questions/64300537

复制
相关文章

相似问题

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