node-annotation开发的初衷是因为node本身在服务层面并不太成熟,而且代码层次及维护各大公司都有自己的做法,借鉴于Java里spring的想法开发了这个,当然在功能实现上和spring相差甚多,这里只实现了几个重要功能,欢迎有志同道合者共同来维护。
注解区别于正常可运行的代码,仅仅是注释的写法,这里写法格式为:
/*@注解名称(注解参数)*/
注解参数支持格式:
- 单引号或者双引号括起来的字符串
- JSON格式
纳入node-annotation管理 如果需要使用node-annotation来处理模块,需要在扫描文件完成后才能做业务操作
var nodeAnnotation = require('node-annotation');
/** 配置全局错误处理
* [Function] 错误处理函数
*/
nodeAnnotation.setGlobalErrorHandler(function(err){
console.error(err);
})
/** 配置node-annotation内的日志流出
* [Boolean] 是否开启日志,默认true
* [String] "error/warn/info/log" 输出日至级别,默认warn
* [Function/LoggerObject] 日志处理函数或对象(类似log4js的Logger对象),默认为console
*/
nodeAnnotation.setLogger(true, 'info', function(str, level) {
console.log('[NodeAnnotation]', str);
});
/* 配置资源路径
* [String] 配置文件所在路径(文件夹),默认工程目录下的resoucres文件夹
*/
nodeAnnotation.configurePath(path.join(process.cwd(), 'resources'));
nodeAnnotation.start(源文件路径, function() {
nodeAnnotation.app(/*你的express app*/)
//你的业务代码
});
限制 使用该注解功能有个约束,如果注解修饰的是方法,只针对通过module.exports={..}
导出的才有效,比如正确的写法
/*@Controller*/
module.exports = {
/*@RequestMapping("/user/{name}")*/
user: function(name, req, res){
//do something
}
};
错误的写法
/*@Controller*/
/*@RequestMapping("/user/{name}")*/
function user(name, req, res){
//do something
}
module.exports = {
user: user
};
-
全局错误配置
会包裹
start
的回调函数(你的业务代码应该全部置于回调中),能够捕获其内的同步或者异步错误(捕获参见trycatch)默认情况会直接打印错误到控制台
/** 配置全局错误处理
* [Function] 错误处理函数
*/
nodeAnnotation.setGlobalErrorHandler(function(err){
console.error(err);
})
-
日志流出配置
node-annotation在编译和执行过程中会产生一系列日志,在不同情况下你可能对是否输出日志以及需要哪些日志有着不同的需求。我们定义了四个日志级别:error,warn,info,log。
默认情况下我们会打印warn级别及以上的日志到console,当你开启debug模式(指直接在启动node时追加
--debug
或--debug-brk
)时,则会打印log级别的日志(即全部日志)。
/** 配置node-annotation内的日志流出
* [Boolean] 是否开启日志,默认true
* [String] "error/warn/info/log" 输出日至级别,默认warn
* [Function/LoggerObject] 日志处理函数或对象(类似log4js的Logger对象),默认为console
*/
nodeAnnotation.setLogger(true, 'info', function(str, level) {
console.log('[NodeAnnotation]', str);
});
-
资源文件路径配置
在注解中使用Configure时需要配置资源文件所在路径
默认情况会使用node启动目录下的resources目录
/* 配置资源路径
* [String] 配置文件所在路径(文件夹),默认工程目录下的resoucres文件夹
*/
nodeAnnotation.configurePath(path.join(process.cwd(), 'resources'));
-
路由中间件启用
在注解中使用RequestMapping时需要配置web服务,我们会将你的路由规则作为一个router中间件置入外围的express服务。
请务必在
start
的回调函数内配置该中间件。
var app = express.createServer();
nodeAnnotation.app(app);
// 实际在annotation内会 app.use(`AnnotationRouter`)
-
编译启动
注解需要指定它需要编译的目录,将扫描该目录下所有文件进行正则匹配完成注解编译。
请注意一般不要把node_modules包含进扫描目录,这样会极大降低启动速度,尽量仅包含使用了注解的少数几个目录。
/** 注解编译启动
* [Array] 需要被扫描编译的目录
* [Function] 扫描完成的回调,你的全部业务代码应该置于这里
*/
nodeAnnotation.start(dirs, function() {
nodeAnnotation.app(/*你的express app*/)
//你的业务代码
});
-
Controller 访问控制层,请求映射后的处理类
- RequestMapping 请求映射
- ResponseBody 返回包装
- ExceptionHandler 异常处理
-
ControllerAdvice 访问器增强,将其内的ExceptionHandler应用到所有Controller
-
Service 业务层,负责处理业务相关逻辑
-
Repository 持久层,负责数据持久化相关
- Aspect 切面标识
- PointCut 切点,描述哪些模块方法会被处理
- Before 符合切点描述的方法执行前处理
- After 符合切点描述的方法执行后处理
- Around 符合切点描述的方法执行前后都会被处理
- Throws 符合切点描述的方法抛出异常时处理
- AfterReturning 符合切点描述的方法的回调执行前处理
- AutoLoad 自动加载文件,一般在创建注解类的时候需要用到
- Configure 加载配置文件,通过该标签直接获取配置里的值
请挪驾 自定义注解
请参考项目 node-annotation-example
请参考项目 node-annotation-extend