Я новичок в FeathersJS и пытаюсь сделать следующее:
В моем приложении есть две сущности с именами Company и User. Когда кто-то регистрирует новую компанию, сообщается имя, адрес электронной почты и пароль владельца.
Затем, после создания записи для компании в моей таблице компаний, мне нужно:
1) Получить id новой компании;
2) Создайте пользователя с этим id объявлением companyId, именем владельца, адресом электронной почты владельца и заданным паролем.
Конечно, это должно быть сделано в службе after insert hook для компаний, но я очень запутался в том, как вызвать службу пользователей для выполнения этой вставки.
Это мой файл компании.model.js:
module.exports = function (app) {
const sequelizeClient = app.get('sequelizeClient');
const companies = sequelizeClient.define('companies', {
company: {
type: DataTypes.STRING,
allowNull: false,
size: 100
},
cpfcnpj: {
type: DataTypes.STRING,
allowNull: false,
size: 25
},
owner: {
type: DataTypes.STRING,
allowNull: false,
size: 100
},
cpf: {
type: DataTypes.STRING,
allowNull: false,
size: 25
},
email: {
type: DataTypes.STRING,
allowNull: false,
size: 100
},
addr1: {
type: DataTypes.STRING,
allowNull: false,
size: 100
},
addr2: {
type: DataTypes.STRING,
allowNull: false,
size: 100
},
city: {
type: DataTypes.STRING,
allowNull: false,
size: 100
},
state: {
type: DataTypes.STRING,
allowNull: false,
size: 2
},
zip: {
type: DataTypes.STRING,
allowNull: false,
size: 10
},
phone: {
type: DataTypes.STRING,
allowNull: false,
size: 50
}
}, {
hooks: {
beforeCount(options) {
options.raw = true;
}
}
});
companies.associate = function (models) {
};
return companies;
};
а это мой пользователи.model.js:
module.exports = function (app) {
const sequelizeClient = app.get('sequelizeClient');
const users = sequelizeClient.define('users', {
companyID: {
type: DataTypes.INTEGER,
allowNull false,
size: 11
},
name: {
type: DataTypes.STRING,
allowNull: false,
size: 100
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
size: 100
},
password: {
type: DataTypes.STRING,
allowNull: false
},
type: {
type: DataTypes.STRING,
allowNull: false,
default: 'CL',
size: 2
}
}, {
hooks: {
beforeCount(options) {
options.raw = true;
}
}
});
users.associate = function (models) {
};
return users;
};
Я так понимаю, что в моем файле компании.hooks.js у меня должно быть что-то вроде
module.exports = {
before: {
all: [],
...
},
after: {
...
create: [ insertUser() ],
...
},
error: {
...
}
};
но помимо этого я действительно не знаю, как мне написать свою функцию insertUser() или куда ее поместить. Как я уже говорил, я новичок в FeathersJS, это мой первый день.
На первую часть вопроса дан ответ. Я использовал некоторые console.info() здесь и там и обнаружил, что объект context, переданный в хук, имеет внутри себя объект с именем result, когда вы находитесь в after хуке, что и имеет место. С помощью этого объекта теперь есть идентификатор компании, имя и адрес электронной почты владельца.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это все внутри context.
Когда вы используете hook в FeatherJS, ваш hook function получает объект с именем context, и этот объект имеет все, что вам нужно.
В after hook у нас есть context.result, объект с результатом предыдущего запроса. В запросе на вставку, как и в вопросе, context.result есть вся вставленная информация, включая идентификатор вставленной компании.
Кроме того, объект context содержит ссылку на объект app FeathersJS, который представляет собой запущенное приложение со всеми его службами, хуками и всем остальным. Итак, чтобы создать пользователя, как требуется в вопросе, все, что вам нужно сделать, это:
Отредактируйте файл src/services/companies/companies.hooks.js и добавьте в самом начале, после импорта, такую функцию
const createUser = function(context) {
const userRecord = {
companyID: context.result.id,
name: context.result.owner,
email: context.result.email,
// Get all other information you need here
};
context.app.service('users').create(userRecord);
};
Зарегистрируйте этот хук прямо внизу в том же файле
module.exports = {
before: {
all: [authenticate('jwt')],
find: [],
get: [],
create: [],
update: [],
patch: [],
remove: []
},
after: {
all: [],
find: [],
get: [],
create: [ createUser ], // <<=== registering the hook
update: [],
patch: [],
remove: []
},
error: {
all: [],
find: [],
get: [],
create: [],
update: [],
patch: [],
remove: []
}
};
И это сделано! Каждый раз, когда вы создаете новую компанию, будет выполняться after hook, и будет создаваться новый пользователь, связанный с этой компанией.
Нажмите здесь для получения дополнительной информации о хуках FeathersJS.