0
我是新来的nodeJS,我试图构建一个聊天应用程序。我的想法是,当用户点击一个名字时,他将能够与该用户聊天。 我使用MongoDB来保持socket.id提供的用户名和他们的id。 这是我的代码:socket.broadcast.to(id).emit()无法正常工作,但socket.broadcast确实
文件index.html位于“public”目录中。
index.html,函数start()在jquery之外,因为它不想像那样工作。
<!DOCTYPE html>
<html lang="en">
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script src="/socket.io/socket.io.js"></script>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="style.css">
<title>Document</title>
<link href="/favicon.ico" type="image/x-icon" rel="icon" />
</head>
<body>
<h1>Tchat</h1>
<div class="inscrire">
<form action="" id="form">
<input type="text" placeholder="Enter your name" id="username">
<input type="submit">
</form>
</div>
<div id="container">
<div id="userList">
</div>
<div class="chat" id="chat">
<div class="chatHeader" id="chatHeader"></div>
<div class="messages"> </div>
<div>
<form action="" id="send">
<textarea name="name" rows="8" cols="80" id="message"></textarea>
<input type="submit" value="envoyer">
</form>
</div>
</div>
</div>
<script>
var socket = io();
var $currentUser;
function start(id, name){
document.getElementById("chat").style.display = "block";
document.getElementById("chatHeader").innerHTML = name;
socket.emit('startchat', id, $currentUser);
}
$(document).ready(function(){
$('#container').hide();
//partie users
function username(){
var username = $("#username").val();
if(username !== ''){
$currentUser = username;
socket.emit('new user',{user: username});
$("#username").val('');
$('#form').hide();
return true;
}
else{
return false;
}
}
$('.inscrire').submit(function(event){
event.preventDefault();
if(username()){
$('#container').show();
$('.chat').hide();
}
});
//display users
socket.on('userName', function(data){
for(var i = 0; i < data.length; i++){
if(data[i].name != $currentUser){
$('#userList').append('<li onClick="start(\'' + data[i].socketId + '\''+','+'\'' + data[i].name + '\')">'+ data[i].name + '</li>');
}
}
});
//msg part
$('#send').submit(function(event){
event.preventDefault();
var msg = $("#message").val();
socket.emit('message',msg);
$("#message").val('');
});
socket.on('msg', function(data){
alert(data);
});
});
</script>
</body>
</html>
server.js
var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io').listen(http);
var mongo = require('mongodb').MongoClient;
app.use(express.static('public'));
mongo.connect('mongodb://127.0.0.1/chat', function(err,db){
if(err) throw err;
console.log('connected to database');
io.on('connection', function(socket){
socket.on('new user', function(data){
db.collection('users').find({"name":data.user}).count().then(function(numItems) { //to avoid the Promise<spending> mistake
if(numItems == 0){
db.collection('users').insertOne(
{"name": data.user,
"socketId": socket.id}
);
console.log('data inserted');
callback();
}
else{
console.log('data already inserted');
callback();
}
});
//envoyer le nom du user pour l'afficher
db.collection('users').find().toArray(function(err,res){
if(err) throw err;
socket.emit('userName', res);
});
});
//partie msg
socket.on('startchat', function(id, name){
socket.on('message', function(data){
console.log(data);
socket.broadcast.to(id).emit('msg', data);
});
});
});
});
http.listen('3000', function(){
console.log('server is listening on port 3000');
});
我想要的用户时,由其他用户发送消息提醒,但没有奏效。如果我使用socket.broadcast.emit('msg',data)和socket.broadcast.to(id).emit('msg',data),那也不起作用。我究竟做错了什么?