如何从sails.js上的不同操作获取返回的对象?

时间:2015-08-02 03:27:38

标签: javascript model-view-controller controller sails.js action

我还是sails.js的新手,目前正试图从不同的行动中获取返回的对象。

目前我所知道的是,如果我使用' getUserTransaction'在“UserController”中进行操作,然后我只能将其返回到' getUserTransaction.ejs'使用本地视图(_.each)。 (CMIIW) 例如:

//UserController
getUserTransaction: function (req, res, next){
   UserTransaction.find({user:req.param('userid')}).exec(function foundTransactions(err, transactions){
      if(err) return next(err);

      if(!transactions) return next();

      res.view({
         transactions: transactions
      });
   });
}

//getUserTransaction.ejs 
...
<% _.each(transactions, function(transaction){ %>
   <tr>
       <td><%= transaction.data %></td>
       <td><a href="<%= transaction.path %>">Link</a></td>
   </tr>
<% }); %>
...

但是,如果我想从&#39; getUserHobby&#39;返回对象怎么办?行动顽固&#39; UserController&#39; to&#39; getUserTransaction.ejs&#39;视图?。 这是我的代码,我无法正确使用

//UserController
getUserHobby: function (req, res, next){
   UserHobby.find({user:req.param('userid')}).exec(function foundHobbies(err, hobbies){
      if(err) return next(err);

      if(!hobbies) return next();

      res.view('user/getUserTransaction', {
         hobbies: hobbies
      });
   });
}

//getUserTransaction.ejs
...
<% _.each(hobbies, function(hobby){ %>
   <tr>
       <td><%= hobby.type %></td>
       <td><%= hobby.name %></td>
   </tr>
<% }); %>
...

我已经尝试过这样做并且回归未定义的爱好&#39;。所以我应该如何做对。

此致

1 个答案:

答案 0 :(得分:0)

首先,在Sails controller操作中,您不应使用第3个参数(next)。

  

与Express中间件方法不同,Sails控制器操作应始终是请求链中的最后一站 - 也就是说,它们应始终导致响应或错误。虽然可以在操作方法中使用next,但强烈建议您尽可能使用策略。

即使您想抛出错误,也应该使用内置的response方法

以下是我编写控制器操作的方法:

// Inside api/controllers/UserController.js
getUserTransactions: function (req, res) {
  if(!req.param('userid'))
    return res.badRequest(); // Send a 400 response back down to the client indicating that the request is invalid

  UserTransaction
    .find({ user: req.param('userid') })
    .exec(function foundTransactions(err, transactions){
      if(err)
        return res.negotiate(err); // Send an appropriate error response back down to the client

      // If there is no transactions, you can display a message in your view
      return res.ok({ transactions: transactions }); // Send a 200 ("OK") response back down to the client with the provided data
  });
}

以下是您可以编写相应视图的方法:

// Inside views/user/getUserTransaction.ejs
<% if(data.transactions.length) { %>
    <!-- display each transactions... -->
    ...
<% } else { %>
    <p>This user has no transaction yet.</p>
<% } %>

对于您的其他操作,以下是res.okpathToView param

的使用方法
res.ok({ hobbies: hobbies }, 'user/getUserTransactions');

您的视图必须位于views/user/getUserTransactions.ejs文件中才能正常运行。

现在我们已经审核了您的代码,我们可以回答您的问题。

所以你想在另一个中调用控制器的动作。这是possible但不推荐。

这是你应该做的:

// api/controllers/UserController.js
// In your getUserTransactions method (you should change its name)
// Get the user transactions
UserTransaction
  .find({ user: req.param('userid') })
  .exec(function foundTransactions(err, transactions) {
    if(err) return res.negotiate(err);

    // Get the user hobbies
    UserHobby
      .find({ user: req.param('userid') })
      .exec(function foundHobbies(err, hobbies) {
        if(err) return res.negotiate(err);

        return res.ok({
          transactions: transactions,
          hobbies: hobbies
        });
   });
});

您还可以使用services来简化控制器。

// api/services/UserService.js
module.exports.getUserTransactions = function (userId, cb) {
  UserTransaction
    .find({ user: userId })
    .exec(cb);
};

module.exports.getUserHobbies = function (userId, cb) {
  UserHobby
    .find({ user: userId })
    .exec(cb);
};

// Inside api/controllers/UserController.js
UserService
  .getUserTransactions(req.param('userid'), function (err, transactions) {
    if(err) return res.negotiate(err);

    UserService
      .getUserHobbies(req.param('userid'), function (err, hobbies) {
        if(err) return res.negotiate(err);

        return res.ok({
          transactions: transactions,
          hobbies: hobbies
        });
    });
});