node.js - 使用 awilix 在函数中注入依赖项
问题描述
我一直在为我的项目关注基于组件的结构,并且为此目的克隆了这里列出的 repo
除了服务之外,一切都很好并且可以测试。
所以我决定使用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;
};
对于整个文件夹结构和源 conde,请通过 repo。
解决方案
为了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
推荐阅读
- c# - XML 将重复的 ID 合并为单个 XML 并删除重复的
- c# - 如何在 twilio 收集的 URL 中传递查询参数
- r - R - 通过 RCurl 从 javascript 链接中提取 CSV 文件
- java - 处理另一个类的 JFrame
- angular - 当我有时希望它静默失败时,处理 Promise 捕获错误的最佳方法
- python - h5py:如何重命名尺寸?
- angular - 如何从头开始在 Angular 7 中安装依赖项?
- cmake - 无法使用 CMake 为 Yocto 安装常规文件
- symfony4 - 带有自定义 POST 操作的 __invoke() 函数中的 $data 为空
- windows - Windows IIS WebDav 上的 TagSpaces