2014-10-23 3 views
5

Я совершенно новичок в Nodejs и стараюсь познакомиться с ним. Ну, в настоящее время я пытаюсь нажимать уведомления в веб-браузере, если в базе данных происходят какие-либо изменения. У меня есть часть кода, которую я раньше использовал для тестирования. После кода отлично работает для отправки обновлений в браузере, когда содержимое таблицы базы данных изменить:Слушайте по определенному URL-адресу вместо порта

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> 

Теперь, как вы можете видеть, что в настоящее время сервер прослушивает port 8000. Мне просто интересно, как я могу изменить его для прослушивания определенного URL-адреса? Потому что, если я собираюсь реализовать в проекте сервера, то я не собираюсь использовать url для прослушивания в портах? Скорее я хочу использовать его как обычный Url, так как я могу плавно отправлять уведомление, если какой-либо пользователь подключен к определенному URL-адресу?

Любая помощь?

+2

Северс не прослушивает URL-адреса. Они прослушивают данный порт для заданного IP-адреса. Вы не можете это изменить. Если вы имеете в виду, что вам не нужно вводить номер порта в URL-адресе, вы хотите, чтобы ваш сервер прослушивал порт 80 (порт http-по умолчанию). Соединение не связано с URL-адресом. Это делается для данного порта на заданном сервере, а затем путь по URL-адресу передается как данные после подключения. – jfriend00

+0

Я не понимаю, как я буду применять для push-уведомлений по определенному URL-адресу? скажем, у меня есть следующая ссылка, где пользователь входит в систему http: // www.example.com/updates'. Теперь, как я могу отправлять обновления по этой ссылке, если какие-либо изменения происходят в базе данных? с текущим сценарием это будет так: 'http: //www.example.com: 8000/updates'. – Princess

+0

Вы делаете свой сервер прослушиванием на порту 80, и ваш сервер узла отвечает на путь '/ updates'. Вот как вы подключаетесь к http: // www.example.com/updates'. Если в URL-адресе нет номера порта, а протокол - 'http', то порт по умолчанию соответствует порту 80. – jfriend00

ответ

4

Если вы хотите, чтобы ваш сервер узла отвечал на URL http://www.example.com/updates, вы заставляете ваш сервер прослушивать порт 80 (порт по умолчанию, если ни один порт не указан, а протокол «http»). И затем вы ответите серверу на маршрут "/updates".

Серверы прослушивают определенный порт по определенному IP-адресу. Они не прослушивают путь или URL. Браузер использует DNS для получения IP-адреса для хоста в URL-адресе. Если в URL-адресе есть номер порта, он использует этот порт. Если нет, он использует порт по умолчанию для конкретного протокола. Затем он делает TCP-соединение с этим IP-адресом на этом порту. Затем, если протокол HTTP, он отправляет запрос на это соединение и включает в себя путь.

Таким образом, сервер получает входящее соединение, а затем как часть протокола HTTP, он получает глагол (GET, POST, DELETE и т. Д.) И путь, который он задает серверу, чтобы решить, что делать на основе входящей команды/пути.

+0

ну, я пробовал свой путь, но он всплывает 'EADDRINUSE'. Это потому, что мой апачи также работает на одном и том же порту. Поэтому просто интересно, как этого избежать? – Princess

+2

Правильный способ, очевидно, будет заключаться в использовании разных портов. Но мне повезло с использованием другого localpoint loopback ip address (127.0.0.5) с express ('express(). Listen (80, '127.0.0.5')') вместо http. – laggingreflex

+1

@Princess - для данного IP-адреса может быть только один прослушиватель на порт.Вам либо нужно использовать разные IP-адреса (которые обычно означают другой сервер, за исключением случаев, когда многосетевые соединения на ящике), либо другой порт, либо объединить функции с ваших экспресс-серверов и серверов apache на один сервер. – jfriend00

Смежные вопросы