#node.js #express #dependency-injection #awilix
#node.js #выражать #внедрение зависимостей #авиликс
Вопрос:
Я следил за структурой на основе компонентов для своих проектов, и я клонировал репозиторий для этой цели, указанный здесь
Все в порядке и поддается проверке, кроме сервисов.
Поэтому я решил использовать awilix для внедрения зависимостей в сервисы.
Это то, что я пробовал.
Я создал container.js
файл в loaders
.
const awilix = require('awilix');
const db = require('../db');
const AuthService = require('../components/auth/auth.service');
const container = awilix.createContainer({
injectionMode: awilix.InjectionMode.PROXY,
});
function setup() {
container.register({
db: awilix.asValue(db),
doGetAllService: awilix.asValue(AuthService.doRegister),
});
}
module.exports = {
container,
setup,
};
Я вызвал этот контейнер, app.js
как показано ниже.
const express = require('express');
const app = express();
const cors = require('cors');
// load environment config variables
require('dotenv').config();
require('./loaders/container').setup();
...
В документе говорится, что первым аргументом будут введенные зависимости. Но когда я это делаю console.log
, я все равно получаю неопределенность.
const doRegister = async (opts, { username, password }) => {
console.log(opts);
const user = await User.create({
username,
password,
role_id: 1, // assign role id here
});
return user;
};
Для получения полной структуры папок и исходного кода, пожалуйста, просмотрите репозиторий.
Комментарии:
1. В вашем репозитории я не вижу никаких ссылок на awilix и не вижу, как вы регистрируете awilix cradle на свой http-сервер (например, awilix-express). Без этого вы никогда ничего не получите. Было ли это вашим намерением опубликовать этот вопрос? В любом случае я надеюсь, что мой ответ ниже поможет вам решить вашу проблему.
Ответ №1:
Чтобы awilix
разрешить какие-либо зависимости, что-то должно потребляться из контейнера зависимостей или загружаться из него. Один способ container.resolve(...);
(не постоянный), а другой — привязка базы данных к конвейеру запросов.
Например awilix-express
, можно привязать cradle к таким запросам, как scopePerRequest(container)
:
Добавьте это в промежуточное программное обеспечение вашего сервера
app.use(scopePerRequest(контейнер));
В случае, если вам нужен полный исходный код, вы можете проверить этот репозиторий: https://github.com/fdm-monster/fdm-monster/blob/fb0fc8075cfcd840ae7b50519fe6dd1525b03034/server/app-core.js#L63
Я рекомендую вам ознакомиться с awilix-express
полной настройкой сервера с контроллерами, поскольку это действительно чище, чем просто маршруты API на основе функций: https://www.npmjs.com/package/awilix-express