基于(Sails文档)[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": "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);
}
};
所以选项从控制器接收params,但我不知道为什么这应该起作用,因为myEmailSendingLibrary
根本没有定义。
另外,我想在服务中使用ORM(水线)实现一个find方法。基于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);
});
当我尝试加入所有问题时,问题就来了。如果我创建了名为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);
});
}
};
这不起作用,因为没有创建res。如果我尝试声明一个函数,以便像这样访问res变量:
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 :(得分: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);
})
}
};
我假设你的config / bootstrap.js 您在安装 q
后添加了sails.q=require('q');
(npm install q --save
)
在上面的服务和控制器代码中,我使用了承诺和没有承诺的服务。 关于q-promise https://www.npmjs.com/package/q