我使用restler(https://github.com/danwrong/restler)从外部源进行api调用。在Sailsjs中,根据我的理解,辅助函数称为服务。我把restler的代码放在他们自己的服务中,所以我不会一遍又一遍地重复使用相同的代码。但是,在我的控制器中工作正常的restler功能不再适用于该服务。例如:
//api/services/myService.js
module.export{
httpGet: function(){
var rest = require('restler');
rest.get('http://google.com').on('complete', function(result) {
if (result instanceof Error) {
console.log('Error:', result.message);
this.retry(5000); // try again after 5 sec
} else {
console.log(result);
}
});
}
}
我知道我的服务使用正确;我已经尝试从服务中返回一个变量来仔细检查:
httpGet: function(){
var check = null;
var rest = require('restler');
rest.get('http://google.com').on('complete', function(result) {
if (result instanceof Error) {
check = false;
console.log('Error:', result.message);
this.retry(5000); // try again after 5 sec
} else {
console.log(result);
check = true;
}
});
return check;
//in the controller, myService.httpGet() returns null, not true or false
}
非常感谢任何帮助。 Salisjs v0.12.4
答案 0 :(得分:2)
最好让服务接受回调。
//api/services/myService.js
module.exports = {
httpGet: function(callback){
var rest = require('restler');
rest.get('http://google.com').on('complete', function(result) {
if (result instanceof Error) {
console.log('Error:', result.message);
return callback(result, null)
//this.retry(5000); // try again after 5 sec
} else {
console.log(result);
return callback(null, result)
}
});
}
}
然后从您的控制器调用服务时传递回调
myService.httpGet(function callback(err, result){
// handle error
// use result
})
此外,关于您的问题,您将提前从服务返回return check;
,并为您分配值null
。
PS:您可以使用promises而不是使用回调(callback hell)
答案 1 :(得分:0)
您应该将httpGet
函数导出为模块对象的属性。基本上,你有一个"小"错字。而不是:
module.export{
httpGet: function(){
你应该有这个:
module.exports = {
httpGet: function(){
此外,如果您想要返回结果,请添加callback
:
module.exports = {
httpGet: function(callback){
...
if (result instanceof Error) {
console.log('Error:', result.message);
return callback(result, null)
} else {
console.log(result);
return callback(null, result)
}
...
...或使用Promises。