无法访问Sails服务的resvariables

基于(Sails文档)[ http://sailsjs.org/documentation/concepts/services/creating-a-service] ,我可以在services文件夹内创build一个服务,这样做:

 // EmailService.js - in api/services module.exports = { sendInviteEmail: function(options) { var opts = {"type":"messages","call":"send","message": { "subject": "YourIn!", "from_email": "info@balderdash.co", "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(水线)的查找方法。 基于Sails文档,必须是这样的:

  User.find({name:'Finn'}).exec(function (err, usersNamedFinn){ if (err) { return res.negotiate(err); } sails.log('Wow, there are %d users named Finn. Check it out:', usersNamedFinn.length, usersNamedFinn); return res.json(usersNamedFinn); }); 

当我尝试join所有问题时,问题就来了。 如果我创build了以下名为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); }); } }; 

这不会工作,因为没有创buildres。 如果我尝试声明一个函数,以获得像这样的resvariables的访问权限:

 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为了发回查询的结果?

谢谢!!

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

你的服务

 // ./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); }) } }; 

我假设在你的configuration/ bootstrap.js你已经添加了sails.q=require('q'); 安装q后

npm install q --save

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