首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使节点数组可在视图中访问

使节点数组可在视图中访问
EN

Stack Overflow用户
提问于 2015-06-03 20:24:57
回答 1查看 66关注 0票数 0

我正在尝试使用express/nodejs创建一个基本的消息传递系统。而我能够成功地向所有用户发送消息。我需要用户能够以一对一的私人方式互相传递信息。

下面我要做的事情很简单。当用户登录时,一旦验证了会话,就将用户对象存储在clients数组中,并使该数组可在视图中访问--就是这样!

这样做的目的是,随着用户登录,这个数组将在服务器上增长,我需要在视图中使其易于访问,这样我就可以生成一个可供聊天的在线用户列表。

我尝试了几种不同的方法,下面的方法在视图中产生一个空数组。

我的目标是在联机用户登录时将其存储在服务器上的一个数组中,并在视图中访问该数组。

我很感谢你的建议。

index.js

代码语言:javascript
复制
var express     = require('express');
var app = express();
var bodyParser = require('body-parser');
var mysql       = require('mysql');
var session     = require('client-sessions');
var server      = require('http').createServer( app );
var io          = require('socket.io').listen( server );
var clients = [];

app.locals.delimiters = '<% %>';


app.get('/', function(req, res){
    if(req.session && req.session.user.username){
        mysql.query("SELECT * FROM users WHERE username = ? AND pass = ? LIMIT 1", [req.session.user.username, req.session.user.pass], function(error, results, fields){
            if(results.length === 0){
                req.session.reset();
                res.redirect('/login');
            }else{
                res.locals.user = results[0];

                io.sockets.on('connection', function(socket){
                    clients.push({user : res.locals.user, socket : socket});
                });

                res.render('index');
            }
        });
    }else{
        res.redirect('/login');
    }
});

server.listen( 3331 ); //chat port

io.sockets.on('connection', function(socket){  

    //load all users
    socket.on('load users', function(){
       io.emit('load users', {clients : clients});      
    });

    socket.on('error', function(err){
        console.error(err.stack);
    });
});

module.exports = app;

index.hjs

代码语言:javascript
复制
<div class="messenger-user" ng-repeat="n in clients">
    <div class="avatar-icon glyphicon glyphicon-user">
    </div>
    <div class="user-meta">
        {{n.user.firstname}} {{n.user.lastname}}
    </div>
</div>

index.hjs JavaScript

代码语言:javascript
复制
socket.emit('load users', function(clients){
    $scope.clients = clients;
    $scope.$apply();
});
EN

回答 1

Stack Overflow用户

发布于 2015-06-03 21:10:58

这完全说得通。它发送一个空数组,因为您在填充它之前发送它。

当前: 1)启动MySQL查询以检索和填充用户数组。

2)同时,一个套接字on 'connection'事件被触发(第24行),该事件发出用户数组,该数组当前为空。

3) MySQL查询结束(第3行)并返回所需的数据。

4)在回调函数内部,为io.sockets.on('connection')设置另一个监听器。为时已晚,因为您已经设置了一个,并且连接事件已经发生。因此,同一个事件有两个监听器,而第二个永远不会触发。

您应该做的是等待SQL查询结束,然后填充数组并将其发送给客户端。

HTTPEdit2 :不要同时使用连接和套接字进行身份验证。您正在尝试存储来自HTTP请求的用户对象,以及与HTTP请求无关的套接字。使用套接字执行所有操作:

代码语言:javascript
复制
var clients = [];

io.sockets.on('connection', function(socket){

    socket.on('credentials', function(data){ // data == { "username":"John" , "password":"123456" }
        login(data, socket); // sending credentials and socket to the login function, so both are defined there.
    })
    socket.on('error', function(err){
        console.error(err.stack);
    });
});

function login(data, socket){
    mysql.query("SELECT * FROM users WHERE username='"+data.username+"' AND pass='"+data.password+"' LIMIT 1", [req.session.user.username, req.session.user.pass], function(error, results, fields){
        if(!results.length){
            req.session.reset();
            res.redirect('/login');
        }else{
            clients.push({user : results[0], socket : socket}); // Both defined!
            io.emit('load users', {clients : clients});
            res.render('index');
        }
    });
}

server.listen( 3331 ); //chat port
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30620032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档