在Sails v0.12版本中曾经提供了Service层,Service在传统的MVC结构中处于Controller与Dao之间,具体实现一个业务逻辑服务,但在v0.12中的Service并不能很好实现对Service层的定位,更像是一个公共方法的集合,在v1.0中已经淡化了Service的概念,取而代之的是提出了Helper做为一个提供公共方法的集中场所,用来将重复的代码抽象到单独的文件中,从而在其他各种地方进行复用,当代码增多时,它能提升可维护性。
一个Helper例子
sails generate helper get-absolute-path
sails generate controller test
get-absolute-path.js:
const path = require('path');
module.exports = {
friendlyName: 'Get absolute path',
description: 'Get absolute path',
inputs: {
resolvePath: {
type: 'string',
description: 'The resolve path',
required: true
}
},
exits: {
success: {
outputFriendlyName: 'Absolute path',
outputType: 'ref'
},
},
fn: async function (inputs, exits) {
let absolutePath = path.resolve(sails.config.appPath, inputs.resolvePath);
return exits.success(absolutePath);
}
};
Helper getAbsolutePath实现了一个通过相对路径获取绝对路径的方法。
TestController.js编写测试Controller:
module.exports = {
testGetAbsolutePath: async function(req, res){
let resolvePath = req.param('path');
let absolutePath = await sails.helpers.getAbsolutePath.with({
resolvePath: resolvePath
});
return res.json({
absolutePath: absolutePath
});
}
};
config/routers.js配置路由:
'get /api/test/path/:path': {
controller: 'TestController',
action: 'testGetAbsolutePath',
skipAssets: true
},
一个Rest的路由配置,测试url:http://127.0.0.1:1337/api/test/path/image
Synchronous同步
Sails v1.0默认提供的是异步调用,可以通过配置和修改代码将调用调整为同步方式:
- 将代码中的await和async去掉
- 配置属性sync: true
参考以下修改:
get-absolute-path.js:
fn: function (inputs, exits) {
let absolutePath = path.resolve(sails.config.appPath, inputs.resolvePath);
return exits.success(absolutePath);
},
sync: true
TestController.js:
testGetAbsolutePath: function(req, res){
let resolvePath = req.param('path');
let absolutePath = sails.helpers.getAbsolutePath.with({
resolvePath: resolvePath
});
return res.json({
absolutePath: absolutePath
});
},