Nodejs变量在控制台上打印,但在视图上不打印

时间:2016-04-18 22:19:53

标签: javascript node.js express sails.js

代码就是这个

module.exports = {
index: function (req, res, next) {
    //get an array of all users in user collection
    Notification.find(function foundNotification(err, notifications) {
        if (err) return next(err);
        var elusuario=[];
        User.findOne(2, function foundUser (err, user) {
            if (err) return next(err);
            if (!user) return next();
            console.log(user);
            console.log("----------------------------");
            elusuario = user;
            console.log(elusuario);
        });
        res.view({
            notifications: notifications,
            elusuario: elusuario
        });
    })

}

};

这是控制器,在控制台中打印elusuario很好,但在视图中用户没有值。为什么? 我认为是与全局变量相关的东西。但我不知道 感谢

修改

好的,所以方法是异步的。我试图做的是通过她的user.id找到通知和用户,并获取user.name,如果我这样做

module.exports = {
index: function (req, res, next) {

    //get an array of all users in user collection
    Notification.find(function foundNotification(err, notifications) {
        if (err) return next(err);

        User.find(function foundUser (err, users) {
            if (err) return next(err);
            var usuarios_locotes = [];
            _.each(notifications, function (notification) {

                _.each(users, function (user) {
                    if(notification.token_user==user.token){
                        console.log(user.token);
                        usuarios_locotes.push(user);
                        console.log(usuarios_locotes);
                    };
                });
            });

            res.view({
                notifications: notifications,
                users: usuarios_locotes
            });
        });

    })
}

};

它仍然无法正常工作? __。每个都是异步函数?

抱歉所有这些可能是愚蠢的问题

4 个答案:

答案 0 :(得分:1)

代码运行时,在调用foundNotification之前不会执行函数res.view。我对你的建议是关于Promises的。

您可以按照以下方式更改代码:

function (req, res, next) {
    //get an array of all users in user collection
    Notification.find(function foundNotification(err, notifications) {
        if (err) return next(err);
        var elusuario=[];
        User.findOne(2, function foundUser (err, user) {
            if (err) return next(err);
            if (!user) return next();
            console.log(user);
            console.log("----------------------------");
            elusuario = user;
            console.log(elusuario);
            res.view({
                notifications: notifications,
                elusuario: elusuario
            });
        });

    });
}

答案 1 :(得分:1)

Runtime Error Message: Line 13: java.lang.ArrayIndexOutOfBoundsException: 1 Last executed input: [[1,2,3,4,5,6,7,8,9,10]] 对象的方法findOne以异步方式运行。因此,您在User返回用户对象之前呈现视图。

如果您在findOne之前加console.log,则会在render.viewconsole.log方法之前打印输出。

答案 2 :(得分:0)

findOne 方法是一种异步方法,因此在没有使用适当的数据提供 res.view 的情况下执行 尝试将整个逻辑包装在同一个函数中,它可能看起来很难看,但它现在会做的事情

答案 3 :(得分:0)

好吧......首先,非常感谢大家。我解决了这个问题。

我知道这不是正确的方法,但它有效,所以对我的建议没关系。

编辑之后的问题是在视图中我试图用参数写一个对象,但我发送的是矢量矢量,所以改变这一行:

usuarios_locotes.push(new Object(users[h]));

我可以发送一个对象矢量。

所以..无论如何,谢谢你以后我会改变我的代码来做得更好更有效

这是我的第一篇文章,很抱歉没有阅读如何使用这个哈哈的第一步,因为我认为我犯了很多错误。

对不起我的英语:C