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>

Cервер

 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), данные вновь обновятся и клиент получит уже обновленные данные.

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

Разобрался в проблеме, дело в том, один из вариантов, это на стороне сервера вызвать callback у метода save

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

Думаю так же можно применить еще и promise

Второй вариант развития
Это заменить выборку с new Article, на create, преимущество в том, что он возвращает последний добавленный элемент. Плюс в том, что идет выборка не всей базы и перестроение всех элементов на клиенте, а только одного последнего

  Articles.create({ title :  data.title,
  text: data.text }, (err,doc) => {        
	   io.emit('up', doc);
  });
1 лайк