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 тестирует коллекцию, которую она создает, и обнаруживает, что она не настроена, как она ожидает, и выручает. Хотя вы можете удалить этот тест из кода, это, вероятно, будет означать, что вы получите быстро растущую коллекцию, которая ожидает, что база данных автоматически удалит старые записи.