首页 > 解决方案 > 使用 awilix 在函数中注入依赖项

问题描述

我一直在为我的项目关注基于组件的结构,并且为此目的克隆了这里列出的 repo

除了服务之外,一切都很好并且可以测试。

所以我决定使用awilix在服务中注入依赖。

这是我尝试过的。

container.jsloaders.

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;
};

对于整个文件夹结构和源 conde,请通过 repo。

标签: node.jsexpressdependency-injectionawilix

解决方案


为了awilix解决任何依赖关系,必须从依赖容器中消耗或引导依赖容器。一种方法是container.resolve(...);(不是永久的),另一种是将底座绑定到请求管道。

因为awilix-express可以将摇篮绑定到以下请求scopePerRequest(container)

将此添加到您的服务器中间件

app.use(scopePerRequest(container));

如果您需要完整的源代码,可以查看此存储库: https ://github.com/3d-hub/3d-hub/blob/fb0fc8075cfcd840ae7b50519fe6dd1525b03034/server/app-core.js#L63

我建议您查看awilix-express带有控制器的完整服务器设置,因为这确实比基于函数的 API 路由更干净: https ://www.npmjs.com/package/awilix-express


推荐阅读