2016-03-09 28 views
1

基于(帆文档)[http://sailsjs.org/documentation/concepts/services/creating-a-service],我可以在里面services文件夹这样做创建一个服务:无法访问资源变量上帆影服务

// EmailService.js - in api/services 
module.exports = { 

    sendInviteEmail: function(options) { 

     var opts = {"type":"messages","call":"send","message": 
      { 
       "subject": "YourIn!", 
       "from_email": "[email protected]", 
       "from_name": "AmazingStartupApp", 
       "to":[ 
        {"email": options.email, "name": options.name} 
       ], 
       "text": "Dear "+options.name+",\nYou're in the Beta! Click <insert link> to verify your account" 
      } 
     }; 

     myEmailSendingLibrary.send(opts); 

    } 
}; 

所以选项收到来自控制器的参数,可以,但我不知道为什么这应该工作,因为myEmailSendingLibrary根本没有定义。

此外,我想在服务内部实现ORM(水线)查找方法。基于帆文档,必须是这样的:

,当我试图加入所有的问题就来了。如果我创建了以下服务称为DesignerService.js

module.exports = { 
    findFormIds: function(id) { 
    Designer.find("56dedc1734112e8c1fb078aa").exec(function (err, records) { 
    //}).exec(function (err, finn){ 
     if (err) { 
     return res.negotiate(err); 
     } 
     if (!records) { 
     return res.notFound('Could not find any form.'); 
     } 

     //sails.log('Found "%s"', records.fullName); 
     myFindFormIds.json(records); 
     //return res.json(records); 
    }); 
    } 
}; 

,因为没有创建资源这是行不通的。如果我试图以宣布一个函数来获取这样的访问资源变量:

module.exports = function(req,res){ 
    findFormIds: function(id) { 
    Designer.find("56dedc1734112e8c1fb078aa").exec(function (err, records) { 
    //}).exec(function (err, finn){ 
     if (err) { 
     return res.negotiate(err); 
     } 
     if (!records) { 
     return res.notFound('Could not find any form.'); 
     } 

     //sails.log('Found "%s"', records.fullName); 
     myFindFormIds.json(records); 
     //return res.json(records); 
    }); 
    } 
}; 

我对在findFormIds线意外(错误。

那么我怎样才能访问res var以便发回查询结果呢?

谢谢!

+0

您需要将'res'对象从控制器动作传递给服务 – elssar

回答

1

首先, 您应该在您的控制器中始终对请求和响应执行操作。尽管您可以将响应作为参数传递给服务,然后在该处执行任何操作。 但我更喜欢第一种方式。 你可以使用这样的服务。

服务

// ./api/services/mySpecialService.js 
module.exports={ 
    //this returns prime first number having last digit ==lastDigitOfPrimeNumber 
    giveMePrimeNumber:function(lastDigitOfPrimeNumber){ 
    if(lastDigitOfPrimeNumber===1) 
     return 11; 
    else if(lastDigitOfPrimeNumber===3) 
     return 3; 
    else if(lastDigitOfPrimeNumber===5) 
     return 5; 
    else if(lastDigitOfPrimeNumber===7) 
     return 7; 
    else if(lastDigitOfPrimeNumber===9) 
     return 19; 
    else 
     return "no such a prime number"; 
    }, 

    giveListOfPeople:function(query_name){ 
    var deferred=sails.q.defer(); 
    User.find({name:query_name}).exec(function(err,results){ 
     if(err) 
     deferred.reject(err.message); 
     else 
     deferred.resolve(results) 
    }); 
    return deferred.promise; 
    }, 

}; 

控制器

// ./api/controller/UserController.js 
module.exports={ 
    getMePrimeWithGivenLastDigit:function(req,res){ 
    //if you send name in request body(post request). 
    var lastDig=req.body.lastDigit; 
    var ansJSON={ 
     "primeNumber":mySpecialService.giveMePrimeNumber(lastDig) 
    }; 
    res.ok(ansJSON); 
    }, 

    searchByName:function(req,res){ 
    //if you send name in request body(post request). 
    var name=req.body.name; 
    mySpecialService.giveListOfPeople(name) 
     .then(function(resolvedResult){ 
     res.ok(resolvedResult); 
     },function(failureReason){ 
     res.negotiate(failureReason); 
     }) 
    } 
}; 

我在你的配置假定/ bootstrap.js u必须安装q

npm install q --save)后增加sails.q=require('q');

在上述服务和控制器代码中,我使用了承诺并且没有承诺的服务。 关于q-promise https://www.npmjs.com/package/q