@de1m

Как правильно организовать обращение к монго дб через socket.io?

У меня есть небольшая старница на nodejs и express.js. Клиент общается с сервером через socket.io.
client.on('addLocation', function (location) {
    var locObj = JSON.parse(location);
    var db = mongoose.connection;

    db.on('error', function (error) {
      console.log(error);
    })

    db.once('open', function () {
      var collection = mongoose.model('esspunkts', essSchema);
      var dbEsspunkt = new collection({
        name: locObj.name,
        rating: {
          value: 0,
          rated: 0
        },
        addrr: {
          str: locObj.addr.str,
          plz: locObj.addr.plz,
          tel: locObj.addr.tel,
          mapurl: "http://maps.google.com/?q=" + locObj.addr.plz + " " + locObj.addr.ort + " , " + locObj.addr.str,
          menulink: locObj.menuurl
        }
      });

      dbEsspunkt.save(function (err, dbObj) {
        if (err) {
          console.log(err);
        } else {
          console.log("save successfull ", dbObj);
          mongoose.connection.close();
        }
      })
    })
    mongoose.connect(mongostr);
  })


То есть как видно выше, когде клиент обращается через socket.io к серверу, то на стороне сервера открывается новое соединениек mongodb, а потом снова закрывается.
Собственно первый вопрос, это вообще правильно? Или надо просто в начале открыть соединение и просто держать его открытым? Как это будет выглядеть?

И второй вопрос, я так понимаю, что если будет несколько пользователей, то надо делать очередь? Как это лучше сделать?
  • Вопрос задан
  • 665 просмотров
Решения вопроса 1
@emp1re
Нужно один раз открыть.
const mongoose = require('mongoose');

mongoose.Promise = global.Promise;
mongoose.connect("localhost:27017", function(err) {
	if (err) {
		console.log('MongoDB Connection Error:', err);
		process.exit(1);
	}
});

Модели создайте отдельно. А так у вас выходит что она создается при каждом вызове ивента.

const mongoose = require('mongoose');
let dbEsspunkt = new mongoose.Schema({
    data: { type: any},
}, { timestamps: true });
dbEsspunkt.index(); // если нужно
var Esspunkt = mongoose.model('Esspunkt', dbEsspunkt);
module.exports = Esspunkt;


Очередь за вас сделает Event Loop, тут вопрос уже как вы асинхроность построите.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы