socket.io和node.js无法正常工作

时间:2016-07-22 19:27:01

标签: javascript node.js mongodb sockets socket.io

我正在尝试使用socket.io和node.js练习创建应用程序。这是一个简单的"登录"应用程序,但它似乎无法正常工作,每当我启动应用程序时,使用此地址在Chrome开发者控制台上弹出404未找到的消息:http://localhost:3000/socket.io/?EIO=3&transport=polling&t=1469215104245-2

在我的index.hjs文件中

<div class="input-group">
  <span class="input-group-addon" id="basic-addon1"></span>
  <input type="text" class="form-control username" placeholder="Username" aria-describedby="basic-addon1">
</div>
<div class="input-group">
  <span class="input-group-addon" id="basic-addon1"></span>
  <input type="text" class="form-control password" placeholder="Password" aria-describedby="basic-addon1">
</div>
<button type="button" class="btn btn-primary">Primary</button>
<h2></h2>

<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
<script type="text/javascript">
    var socket = io();
      $('.btn-primary').click(function(){
        var data  = {username: $('.username').val(), password: $('.password').val()};
        socket.emit('log-in',data);

        socket.on('log-in success', function(){
            $('h2').append('success')
        });
      socket.on('log-in fail', function(){
            $('h2').append('fail')
        });


      });


</script>

在我的节点js服务器上(那里有更多代码,但这些是相关位):

var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/userDB');
var userSchema = mongoose.Schema({
    name: String,
    password: String
});
var User = mongoose.model('User', userSchema);


io.on('log-in',function(data){
  User.findOne({ 'username': data.username, 'password': data.password}, function (err, person) {
    if (err) {io.emit('log-in fail')
      return handleError(err)};
    if (!person) io.emit('log-in success');
  })
});

每当我尝试以预制用户身份登录时,都不会得到任何回复。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您不会使用io.on()来侦听来自服务器上给定连接的消息。相反,您可以在侦听给定套接字连接的情况下执行此操作,然后将事件处理程序添加到该特定套接字,并且当您要发送回该套接字时,还可以使用该socket对象发送回。这允许您发送回刚向您发送消息的同一个套接字:

io.on('connection', function (socket) {
    socket.on('log-in', function (data) {
        User.findOne({'username': data.username, 'password': data.password}, function (err, person) {
            if (err) {
                socket.emit('log-in fail')
                return handleError(err)
            };
            if (!person) socket.emit('log-in success');
        })
    });
});

但是,您可能还想知道socket.io连接身份验证的框架使其更像是接受连接的内置部分。如果你愿意,你可以这样做,但它可能会有一些你没想过的问题。

P.S。这个逻辑对我来说有点不对劲。如果在数据库中找到该人,则不会在套接字上发出响应。