MQTT-брокер Mosca (node.js) с бэкэндом MongoDB в облаке Azure

Я пытаюсь запустить брокера Mosca MQTT в среде Node.js с его серверной частью MongoDB в облаке Microsoft Azure. Хранилище DocumentDB имеет API MongoDB.

Сначала я скопировал код примера с веб-сайта Mosca https://github.com/mcollina/mosca/wiki/Mosca-basic-usage

var mosca = require('mosca')

var ascoltatore = {
    type: 'mongo',        
    url: 'mongodb://localhost:27017/mqtt',
    pubsubCollection: 'ascoltatori',
    mongo: {}
};

var moscaSettings = {
    port: 1883,
    backend: ascoltatore,
    persistence: {
        factory: mosca.persistence.Mongo,
        url: 'mongodb://localhost:27017/mqtt'
    }
};

var server = new mosca.Server(moscaSettings);
server.on('ready', setup);

server.on('clientConnected', function(client) {
    console.log('client connected', client.id);     
});

server.on('published', function(packet, client) {
    console.log('Published', packet.payload);
});

function setup() {
    console.log('Mosca server is up and running')
}

... который отлично работает с локально установленным сервером MongoDB.

Затем я заменил два url: вхождения со строкой соединения Node.js, которую можно получить на портале Azure. После этого происходит сбой соединения с Azure DocumentDB со следующей ошибкой:

$ node index.js 
/[...]/node_modules/mongodb/lib/utils.js:98
process.nextTick(function() { throw err; });
                              ^
Error: Cannot recover. Collection is not capped.
at /[...]/node_modules/ascoltatori/lib/mongo_ascoltatore.js:241:26
at handleCallback (/[...]/node_modules/mongodb/lib/utils.js:95:56)
at /[...]/node_modules/mongodb/lib/collection.js:1559:5
at handleCallback (/[...]/node_modules/mongodb/lib/utils.js:95:56)
at /[...]/node_modules/mongodb/lib/collection.js:1528:5
at handleCallback (/[...]/node_modules/mongodb/lib/utils.js:95:56)
at /[...]/node_modules/mongodb/lib/cursor.js:852:16
at handleCallback (/[...]/node_modules/mongodb-core/lib/cursor.js:171:5)
at setCursorDeadAndNotified (/[...]/node_modules/mongodb-core/lib cursor.js:506:3)
at nextFunction (/[...]/node_modules/mongodb-core/lib/cursor.js:652:7)
at Cursor.next [as _next] (/[...]/node_modules/mongodb-core/lib cursor.js:693:3)
at fetchDocs (/[...]/node_modules/mongodb/lib/cursor.js:848:10)
at /[...]/node_modules/mongodb/lib/cursor.js:871:7
at handleCallback (/[...]/node_modules/mongodb-core/lib/cursor.js:171:5)
at nextFunction (/[...]/node_modules/mongodb-core/lib/cursor.js:683:5)
at /[...]/node_modules/mongodb-core/lib/cursor.js:594:7
at queryCallback (/[...]/node_modules/mongodb-core/lib/cursor.js:253:5)
at /[...]/node_modules/mongodb-core/lib/connection/pool.js:457:18
at nextTickCallbackWith0Args (node.js:419:9)
at process._tickCallback (node.js:348:13)

Есть идеи, чего здесь не хватает?

1 ответ

Я не знаю наверняка, но я предполагаю, что Azure DocumentDB не реализует все функции MongoDB, он просто представляет один и тот же сетевой API, так что вы можете использовать существующие клиенты для общения с ним.

В этом случае кажется, что он не поддерживает ограниченные коллекции (которые в основном похожи на циклические буферы), которые mosca будет использовать для ограничения объема данных, которые он в конечном итоге хранит в базе данных. Mosca тестирует коллекцию, которую она создает, и обнаруживает, что она не настроена, как она ожидает, и выручает. Хотя вы можете удалить этот тест из кода, это, вероятно, будет означать, что вы получите быстро растущую коллекцию, которая ожидает, что база данных автоматически удалит старые записи.

Другие вопросы по тегам