【问题标题】:Cannot access to res variable on a Sails service无法访问 Sails 服务上的 res 变量
【发布时间】:2016-03-09 13:00:01
【问题描述】:

基于(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);

    }
};

所以选项从控制器接收参数,但我不知道为什么这应该起作用,因为 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);
});

当我尝试加入所有人时,问题就来了。如果我创建名为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 以发回查询结果?

谢谢!!

【问题讨论】:

  • 您需要将res 对象从您的控制器操作传递给服务

标签: node.js service sails.js


【解决方案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 你在安装后添加了sails.q=require('q'); q

(npm install q --save)

在上述服务和控制器代码中,我使用了带承诺和不带承诺的服务。 关于q-promisehttps://www.npmjs.com/package/q

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 2019-04-14
    • 2015-07-25
    • 2023-03-28
    • 1970-01-01
    • 2014-05-06
    • 2015-11-16
    相关资源
    最近更新 更多