Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Socket IO + MongoDB (https://javascript.ru/forum/node-js-io-js/73249-socket-io-mongodb.html)

monstantin 01.04.2018 14:16

Socket IO + MongoDB
 
Клиент
<form method="POST">
	<input type="text" name="title">
	<button>Отправить</button>
</form>

<ul id="list"></ul>

<script src="/socket.io/socket.io.js"></script>
<script>

	var socket = io();

	function getDataForm(ev) {
		 socket.emit('SubmitForm', { title: title.value });
		 title.value = '';
		 ev.preventDefault();
	}

        form.addEventListener('submit', getDataForm);

	// Принимаем данные от сервера
	socket.on('news', function (data) {
		 // Выводим данные в ul#list
        });	

</script>



Сервер
app.get('/', (req,res) => {
	res.render('home');
});


io.on('connection', function(socket){
    socket.on('SubmitForm', function (data) {
 	
      new Articles({ title :  data.title }).save();


    // Отправляем обновленные данные клиенту 
    Articles.find((err, articles) => {        
    	 socket.emit('news', articles);
    }).sort({date : -1});

  });

  Articles.find((err, articles) => {        
      socket.emit('news', articles);
  }).sort({date : -1});

});


При подключении, emit news отрабатывает отлично, отправляет все данные клиенту, где они уже и выводятся, но как только клиент отправляет новые новые данные на сервер, ожидается , что после добавления(new Articles), данные вновь обновятся и клиент получит уже обновленные данные.

Этого не происходит, при клике данные добавляются, но не обновляются, приходиться обновлять страницу для получения результата

Audaxviator 01.04.2018 18:09

Хе.
new Articles({ title :  data.title }).save( function() {
    // Отправляем обновленные данные клиенту
    Articles.find((err, articles) => {       
    socket.emit('news', articles);
    }).sort({date : -1});
});

monstantin 02.04.2018 00:13

Вот еще вариант нашел использовать вместо new Article
Articles.create({ title :  data.title,
      text: data.text }, (err,doc) => {        
    	   io.emit('up', doc);
      });


И на клиенте по событию up просто вставляем крайний элемент в DOM
Плюс в том, что идет выборка не всей таблицы и далее перестроение всего списка, а только крайне добавленного


Часовой пояс GMT +3, время: 06:07.