Jestem całkowicie nowy dla Nodejs i próbuję go poznać. Cóż, obecnie próbuję przekazywać powiadomienia w przeglądarce internetowej, jeśli nastąpi jakakolwiek zmiana w bazie danych. Mam fragment kodu, którego używałem do testowania jako pierwszy. Poniższy kod działa poprawnie wysłać aktualizacji do przeglądarki, gdy zawartość tabeli bazy danych zmiany:Posłuchaj konkretnego adresu URL zamiast portu
Server.js
var app = require('http').createServer(handler).listen(8000),
io = require('socket.io').listen(app),
fs = require('fs'),
mysql = require('mysql'),
connectionsArray = [],
connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'nodejs',
port: 3306
}),
POLLING_INTERVAL = 3000,
pollingTimer,
pollingTimer_2;
// If there is an error connecting to the database
connection.connect(function(err) {
// connected! (unless `err` is set)
console.log(err);
});
// on server started we can load our client.html page
function handler(req, res) {
fs.readFile(__dirname + '/client.html', function(err, data) {
if (err) {
console.log(err);
res.writeHead(500);
return res.end('Error loading client.html');
}
res.writeHead(200);
res.end(data);
});
}
/*
* This function loops on itself since there are sockets connected to the page
* sending the result of the database query after a constant interval
*
*/
var pollingLoop = function() {
// Doing the database query
var query = connection.query('SELECT * FROM users'),
users = []; // this array will contain the result of our db query
// setting the query listeners
query
.on('error', function(err) {
// Handle error, and 'end' event will be emitted after this as well
console.log(err);
updateSockets(err);
})
.on('result', function(user) {
// it fills our array looping on each user row inside the db
users.push(user);
})
.on('end', function() {
// loop on itself only if there are sockets still connected
if (connectionsArray.length) {
pollingTimer = setTimeout(pollingLoop, POLLING_INTERVAL);
updateSockets({
users: users
});
}
});
};
// creating a new websocket to keep the content updated without any AJAX request
io.sockets.on('connection', function(socket) {
console.log('Number of connections:' + connectionsArray.length);
// starting the loop only if at least there is one user connected
if (!connectionsArray.length) {
pollingLoop();
}
socket.on('disconnect', function() {
var socketIndex = connectionsArray.indexOf(socket);
console.log('socket = ' + socketIndex + ' disconnected');
if (socketIndex >= 0) {
connectionsArray.splice(socketIndex, 1);
}
});
console.log('A new socket is connected!');
connectionsArray.push(socket);
});
var updateSockets = function(data) {
// adding the time of the last update
data.time = new Date();
// sending new data to all the sockets connected
connectionsArray.forEach(function(tmpSocket) {
tmpSocket.volatile.emit('notification', data);
});
};
Client.html
<html>
<head>
<title>Push notification server streaming on a MySQL db</title>
<style>
dd,dt {
float:left;
margin:0;
padding:5px;
clear:both;
display:block;
width:100%;
}
dt {
background:#ddd;
}
time {
color:gray;
}
</style>
</head>
<body>
<time></time>
<div id="container">Loading ...</div>
<script src="socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
// create a new websocket
var socket = io.connect('http://localhost:8000');
// on message received we print all the data inside the #container div
socket.on('notification', function (data) {
var usersList = "<dl>";
$.each(data.users,function(index,user){
usersList += "<dt>" + user.user_name + "</dt>\n" +
"<dd>" + user.user_desc + "\n" +
"<figure> <img class='img-polaroid' width='50px' src='" + user.user_img + "' /></figure>"
"</dd>";
});
usersList += "</dl>";
$('#container').html(usersList);
$('time').html('Last Update:' + data.time);
});
</script>
</body>
</html>
Teraz, jak widać, aktualnie serwer nasłuchuje na port 8000
. Zastanawiam się tylko, jak mogę to zmienić, aby słuchać konkretnego adresu URL? Bo jeśli zamierzam implementować projekt serwera, to nie zamierzam używać adresu URL do odsłuchiwania portów? Raczej chcę użyć go jako zwykłego adresu URL, ponieważ mogę płynnie wysyłać powiadomienia, jeśli dowolny użytkownik jest podłączony do określonego adresu URL?
Każda pomoc?
Severs nie nasłuchuje na adresach URL. Słuchają na danym porcie dla danego adresu IP. Nie możesz tego zmienić. Jeśli masz na myśli, że nie chcesz podawać numeru portu w adresie URL, serwer powinien nasłuchiwać na porcie 80 (domyślny port http). Połączenie nie jest nawiązywane z adresem URL. Jest on wprowadzany do danego portu na danym serwerze, a następnie ścieżka adresu URL jest przekazywana jako dane po połączeniu. – jfriend00
Nie rozumiem, w jaki sposób będę się wtedy stosować do powiadomień push dotyczących konkretnego adresu URL? powiedzmy, że mam następujący link, w którym użytkownik loguje się "http: // www.example.com/updates". Jak mogę teraz przesłać aktualizacje tego linku, jeśli w bazie danych wystąpią jakieś zmiany? przy obecnym scenariuszu będzie to tak: 'http: //www.example.com: 8000/updates'. – Princess
Uczyniasz swojego serwera nasłuchem na porcie 80 i sprawiasz, że serwer twojego serwera odpowiada na ścieżkę '/ updates'. W ten sposób łączysz się z 'http: // www.example.com/updates'. Jeśli w adresie URL nie ma numeru portu, a protokół to 'http', to port domyślnie przyjmuje port 80. – jfriend00