本文只是吐槽这些软件的说明和版本示例更新不及时导致自己纠错麻烦.
按照github上mosca+mongodb的示例(https://github.com/mcollina/mosca/wiki/Mosca-basic-usage)来写,竟然run不起来,报找不到'insert'方法, 然后我就先加载mongodb的node模块看看是否mongodb安装得不对.
然后按照网上的方法nodejs 连数据库mongodb的例子:
https://blog.csdn.net/wangyunbo158/article/details/78751398
可是自己运行却报了db.collection 也没定义. 找了一圈,原来是人家API已经升到3.0以上版本的用法不一样了. callback返回的是client而不是db...
好了确认不是数据库的问题,那是为啥报错呢... 还好最后还是搜出来了,在mosca的issue里,
https://github.com/mcollina/mosca/issues/443
竟然是官方示例调用的时机不对,server.publish消息要在setup后面...为啥这么简单的逻辑在官方示例里还不改,真是有够坑爹的..
所以最后正常运行的示例是长这样的.
var mosca =require ('mosca');
var ascoltatore = {
//using ascoltatore
type: 'mongo',
url: 'mongodb://127.0.0.1:27017/mqtt',
pubsubCollection: 'ascoltatori',
mongo: {}
};
var moscaSettings = {
port: 1883,
backend: ascoltatore,
persistence: {
factory: mosca.persistence.Mongo,
url: 'mongodb://127.0.0.1:27017/mqtt'
}
};
var server = new mosca.Server(moscaSettings);
server.on('ready', setup);
server.on('clientConnected', function(client) {
console.log('client connected', client.id);
});
// Sending data from mosca to clients
var message = {
topic: '/hello/world',
payload: 'abcde', // or a Buffer
qos: 0, // 0, 1, or 2 qos2不支持
retain: false // or true
};
// fired when a message is received
server.on('published', function(packet, client) {
console.log('Published', packet.payload);
});
// fired when the mqtt server is ready
function setup() {
console.log('Mosca server is up and running');
server.publish(message, function() {
console.log('done!');
});
}