无法访问Sails服务上的res变量

时间:2016-03-09 13:00:01

标签: node.js service sails.js

基于(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以便发回查询结果?

谢谢!

1 个答案:

答案 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