【问题标题】:Sails.js model function returns undefined in viewSails.js 模型函数在视图中返回未定义
【发布时间】:2017-09-01 09:53:11
【问题描述】:

在我的 Sails.js 应用程序中,我尝试从我的数据库中返回已批准用户的数量,并使用 count() 查询在我的视图中使用 count 变量。我已将以下代码写入我的 Users.js 模型文件:

countapproved: function(req, res) {
    Users.count({ approval_state: 'approved' }).exec(function(err, found) {
        if (err) {
            console.log('error.');
        }
        console.log(found);
        return found;
    });
}

而且,我正在尝试使用此 EJS sn-p 获得我认为的价值:

<%= Users.countapproved() %>

问题在于 console.log(found);返回正确的值,但在视图中我看到“未定义”。

编辑:用户模型可全局访问。

edit2:我认为 /users/countapproved.ejs 与 res.view({ count: count });但我正在尝试从 homepage.ejs 访问它。

感谢您的帮助。

【问题讨论】:

  • 控制器的名称是什么?
  • 模型:Users.js 控制器:UsersController.js
  • Users.countapproved()更改为sails.controllers.Users.countapproved()
  • 嗨,它说'无法读取未定义的属性'countapproved'。顺便说一句,函数最初是放在模型本身中的,我按照你的建议将它移动到控制器并进行了更改。
  • 对不起,没有注意到你的方法在模型中,你可以试试sails.models.Users.countapproved()

标签: javascript node.js express sails.js


【解决方案1】:

我不确定ejs 模板是否支持开箱即用的传递函数。谷歌搜索肯定会出现很多棘手的方法。

但是,在担心这一点之前,我不认为您的 countapproved 方法正在做您想做的事情,因为它存在一些异步问题。当它调用Users.count().exec() 时,它是异步执行的。在运行exec 的回调之前,代码在下面继续,找到函数的结尾,返回null。当回调中的代码运行时,函数已经返回(虽然console.log运行正常)。

所以,如果我是你,我不会试图让我的模板运行一个函数,尤其是一个异步函数。我会用回调参数更新你的Users 方法:

countapproved: function(callback) {
    Users.count({ approval_state: 'approved' }).exec(function(err, found) {
        if (err) {
            console.log('error:' + err);
        }
        console.log(found);
        callback(err, found);
    });
}

然后,当您希望视图中的批准计数时,您必须通过控制器方法进行路由。在/config/routes.js:

'GET /someroute': 'SomeController.someMethod'

/api/controllers/SomeController:

module.exports = {

    someMethod: function(req, res) {
        Users.countapproved(function(err, found) {
            if (err) {
                // handle the error
            }
            return res.view('someView',{found: found});
        });
    }

};

【讨论】:

  • 感谢您的回答,但我不知道应该将第二个代码块放在哪里。它应该在视图中吗? res.view 本身就在视图中,如何理解它的目标视图?
  • 第二个代码块将进入一个控制器方法,用于返回您的视图。也许你一直是直接路由到视图并且没有使用控制器方法,所以没有看到这个。我会把这些细节放在答案中。
  • 我想我无法理解这里的概念。我没有创建控制器方法,因为我不想在名为 /users/controllername 的路由中访问它我想在 homepage.ejs('/')中访问它。但是将 GET '/' 路由绑定到这个方法有意义吗?
  • 你可以,是的。如果您希望特殊数据出现在您的视图中,那么我的理解是您应该这样做。但是测试一下。创建一个虚拟视图,并传入一些虚拟数据(如控制器方法中的res.view('dummyView', {testString: 'hello there'}))。一旦你习惯了它,它就会非常强大且用途广泛。
猜你喜欢
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多