将对象传递给布局视图undefined sails js

时间:2016-03-20 11:51:27

标签: node.js layout sails.js views

我试图按颜色计算用户数

我的代码在userController.js上

'dashboard': function(req, res) {

var totalAvailable = user.count({
      value: 'blue'
    }).exec(function countCB(error, found) {
      console.log(found);

    });

    res.view({totalAvailable});


  },

当我刷新仪表板时,它会在控制台中计算值为蓝色的用户数量,现在为50,我想在我的仪表板上显示50个

我使用了<%= totalAvailable %>

页面上的

在控制台上显示未定义它输出50

1 个答案:

答案 0 :(得分:0)

这永远不会奏效。因为sails中的 find,findOne,count,create,destroy 等函数是异步的,不会返回任何内容。

那个是你代码中的第一个问题,另一个是res.view(),这个函数用于渲染模板( .ejs 文件)而不是jsons数组。完成它的正确方法是。

'dashboard': function(req, res) {
  //The correct way.
  var totalAvailable;
  user.count({value: 'blue'})
    .exec(function countCB(error, found) {
      console.log(found);
      res.ok(found);// not this--> res.view({found});
    });
},
  

上面的代码是正确的方法。

     

找到

中填充结果后执行res.view()      

我提到的另一种错误方式如下。

'dashboard': function(req, res) {
  //This is extremely wrong way never do this
  var totalAvailable;
  user.count({value: 'blue'})
    .exec(function countCB(error, found) {
      console.log(found);
      totalAvailable=found;
    });
  res.ok(totalAvailable);
}

这是错误的方法,因为 count()是异步函数,不会在执行堆栈上推送。而是使用一些timeOut(队列中的等待时间)将异步函数附加到事件队列。

非异步函数直接推送到执行堆栈并执行。 因此res.ok()不会被阻止并在 user.count()填充结果之前先执行。

所以在节点中执行代码时总要考虑同步性

阅读这些。 https://www.codementor.io/nodejs/tutorial/manage-async-nodejs-callback-example-code https://blog.risingstack.com/node-js-best-practices/

官方nodejs docs https://nodejs.org/dist/latest-v4.x/docs/api/