Security News
GitHub Removes Malicious Pull Requests Targeting Open Source Repositories
GitHub removed 27 malicious pull requests attempting to inject harmful code across multiple open source repositories, in another round of low-effort attacks.
koa-bind-context
Advanced tools
将 context 绑定到项目中的每个角落
解决了在实际项目中除了controller层之外的层次无法访问 context 这个尴尬的问题。
在简单的项目中,所有的参数从 controller 获取然后调用其他层面的方法来获取数据,例如 service 层。
但是在实际应用中,需要满足各种各样的需求,有时候确实是需要在其他层面去读取cookie,和访问context中的其他方法,与中间件更好的结合在一起。
所以我就写了这个模块,设计之初,我想尽可能的不影响正常的开发模式,不需要改变太多的逻辑,但其实是不可能的。
正常的开发模式是在controller 使用 require 引用 service 的模块来调用相应的方法,但是这样就好比一座围墙,没有办法把我封装的逻辑执行,也就没有办法为 service和其他层面的模块绑定context,除非针对原生的require做一层封装,我也有考虑过,但是后来有两点,让我放弃了这个办法
所以在考虑再三之后,我决定用一个综合的办法搞定这个事情,既不会改变太大,又保证了context只会绑定在业务代码中,也就是说,只绑定在它需要绑定的地方(需要用到context的模块)
或许我的解决方案不是最好的,但它绝对是解决方案之一,至于什么是最好的解决方案,不知~~~
npm install koa-bind-context --save
使用Config这个方法来设置哪些模块是需要访问context的,这样会根据配置对这些模块统一绑定context。之后这些模块就可以访问到context了
当然,所有需要绑定context的模块,都会出现在context中,他们互相之间可以通过 this.[配置好的名字]
来访问该模块,需要访问context的模块不能像普通模块那样使用require来调用,因为使用require调用的模块是没有办法绑定context的,所以直接通过 this.[配置好的名字].[模块抛出的方法名]
调用该模块的某个方法(这也是没有办法的事情)
Param | Type | Description |
---|---|---|
[opts] | Object | |
[opts.main] | Object | 业务入口文件(通常是controller层的某个文件,用来导出方法给router调用) |
[opts.context] | Object | 依赖集,所有需要访问context的模块都需要配置在这个字段中 |
koaBindContext.config({
main: {
userCtrl: './user.js'
},
context: {
userService: '../../service/user/index.js',
userProxy: '../../proxy/user/index.js'
}
});
这样就可以在上下文中通过 this.userCtrl
来访问 './user.js'
模块中的方法,通过 this.userService
访问 '../../service/user/index.js'
模块中的方法,通过 this.userProxy
访问 '../../proxy/user/index.js'
中的方法
key的名字可以随意起,起什么名,就用什么名访问该模块
不可以在router中直接require controller中的模块,而是需要使用 koaBindContext.exports() 来抛出controller中的方法。
koaBindContext.exports()抛出方法与入口文件(main中配置的模块)同步,就是说与 main 中配置的模块 module.exports 出来的方法同步。
module.exports = koaBindContext.exports();
koaBindContext.exports 与 ./user.js
module.exports 抛出的方法完全一样,
项目结构
`-- app.js
|-- package.json
|-- controllers
| `-- user
| |-- index.js
| `-- user.js
`-- service
`-- user
`--index.js
app.js
// ...
var user = require('./controllers/user/index.js');
// ...
router.get('/user/:id', user.findById);
// ...
controllers/user/index.js
var koaBindContext = require('koa-bind-context')();
koaBindContext.config({
main: {
userCtrl: './user.js'
},
context: {
UserService: '../../service/user/index.js',
UserApi: '../../proxy/user/index.js'
}
});
module.exports = koaBindContext.exports();
controllers/user/user.js
exports.findById = function *() {
var userID = this.params.id;
this.body = yield *this.UserService.findById(userID);
}
service/user/index.js
exports.findById = function *(id) {
// 不需要require,直接通过this就可以访问到依赖(仅限于配置文件中配置过的)
return yield this.UserApi.get(id);
};
proxy/user/index.js
module.exports = {
get: function (id) {
// 在这里是可以获取到context的
var logined = this.cookies.get('token') ? true : false;
return {id: id, name: 'berwin', age: 21, logined: logined};
}
};
FAQs
Bind the koa-context to the project module
The npm package koa-bind-context receives a total of 1 weekly downloads. As such, koa-bind-context popularity was classified as not popular.
We found that koa-bind-context demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
GitHub removed 27 malicious pull requests attempting to inject harmful code across multiple open source repositories, in another round of low-effort attacks.
Security News
RubyGems.org has added a new "maintainer" role that allows for publishing new versions of gems. This new permission type is aimed at improving security for gem owners and the service overall.
Security News
Node.js will be enforcing stricter semver-major PR policies a month before major releases to enhance stability and ensure reliable release candidates.