我还是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;。所以我应该如何做对。
此致
答案 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.ok
与pathToView
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
});
});
});