@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, а потом снова закрывается.
Собственно первый вопрос, это вообще правильно? Или надо просто в начале открыть соединение и просто держать его открытым? Как это будет выглядеть?

И второй вопрос, я так понимаю, что если будет несколько пользователей, то надо делать очередь? Как это лучше сделать?
  • Вопрос задан
  • 679 просмотров
Решения вопроса 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, тут вопрос уже как вы асинхроность построите.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы