#node.js #koa #strapi
#node.js #koa #strapi
Вопрос:
Итак, я создаю серверную часть сайта для проекта с использованием strapi. Требование к серверной части сайта заключается в том, что должен быть включен компонент электронной коммерции, поскольку клиент хочет выполнять обработку заказов и обрабатывать транзакции по кредитным картам с использованием stripe. С учетом сказанного я решил написать пользовательский контроллер для учетных записей пользователей, которые создаются с помощью плагина пользовательских разрешений для strapi. Таким образом, я мог бы связать учетные записи пользователей из strapi с соответствующими учетными записями клиентов на конце stripe.
Однако, в частности, я столкнулся с одной проблемой. Пользовательские методы пользовательского контроллера, которые я написал для создания и обновления пользователей, похоже, работают так, как задумано. Хотя всякий раз, когда я удаляю пользователей, strapi, похоже, вообще не использует пользовательский метод, который я написал для удаления пользователей. Я даже включил console.log
вызов, но ничего не появляется.
Я не совсем уверен в том, как решить эту проблему, поскольку я не вижу ни одного из вызовов журнала, и strapi, похоже, не выдает никаких ошибок, когда это происходит. Приветствуются любые советы о том, как решить эту проблему.
Вот пользовательский контроллер, над которым я работаю.
<project_dir>/extensions/user-permissions/controllers/User.js
'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') amp;amp; !email) {
return ctx.badRequest('email.notNull');
}
if (_.has(ctx.request.body, 'username') amp;amp; !username) {
return ctx.badRequest('username.notNull');
}
if (_.has(ctx.request.body, 'firstName') amp;amp; !firstName) {
return ctx.badRequest('firstName.notNull');
}
if (_.has(ctx.request.body, 'lastName') amp;amp; !lastName) {
return ctx.badRequest('lastName.notNull');
}
if (_.has(ctx.request.body, 'password') amp;amp; !password amp;amp; 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 amp;amp; 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') amp;amp; advancedConfigs.unique_email) {
const userWithSameEmail = await strapi
.query('user', 'users-permissions')
.findOne({ email: email.toLowerCase() });
if (userWithSameEmail amp;amp; 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') amp;amp; password === user.password) {
delete updateData.password;
}
if(email != null || firstName != null || lastName != null) {
let stripeUpdate = {};
if(email != null amp;amp; (email !== user.email)) stripeUpdate = {...stripeUpdate, email: email};
if((firstName != null amp;amp; (firstName !== user.firstName)) || (lastName != null amp;amp; (lastName !== user.lastName))) stripeUpdate = {
...stripeUpdate,
name: `${firstName != null amp;amp; (firstName !== user.firstName) ? firstName : user.firstName} ${lastName != null amp;amp; (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));
}
};
Ответ №1:
Вы активировали действие уничтожения в user-permissions?
Я протестировал его с помощью этого простого User.js
в <project_dir>/extensions/user-permissions/controllers/
:
module.exports = {
async find(ctx) {
console.log('find!!!');
return [];
},
async destroy(ctx) {
console.log('destroy!!!');
return [];
},
}
console.log('destroy!!!')
вызывается, когда я отправляю запрос на удаление в http://localhost:1337/users/1234