diff --git a/dist/main.js b/dist/main.js index 73345ce..65aab7e 100644 --- a/dist/main.js +++ b/dist/main.js @@ -7,9 +7,9 @@ const MongoSave = require("./mongosave"); log.info("Dispatcher starting"); let dispatcher = new mqtt.MqttDispatcher("mqtts://broker.hottis.de:8883", "wn", "locutus", "/home/wn/server-ca.crt"); dispatcher.register('IoT/espThermometer2/#', 'toJson', EspThermToJson.espThermToJson); -let mongo = new MongoSave.MongoSave(); +let atlasUrl = "mongodb://receiver:esp8266.@cluster0-shard-00-00-7qduq.mongodb.net:27017,cluster0-shard-00-01-7qduq.mongodb.net:27017,cluster0-shard-00-02-7qduq.mongodb.net:27017/hottis?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin"; +let mongo = new MongoSave.MongoSave(atlasUrl); dispatcher.register('IoT/espThermometer2/#', 'MongoSave', mongo); -// plugintest1.pluginTest1Start(dispatcher) dispatcher.exec(); log.info("Dispatcher running"); //# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/dist/mongosave.js b/dist/mongosave.js index 7edc882..9fba1e3 100644 --- a/dist/mongosave.js +++ b/dist/mongosave.js @@ -1,11 +1,48 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const CallChain = require("./callchain"); +const log = require("./log"); +const MongoDB = require("mongodb"); class MongoSave extends CallChain.ABaseChainItem { - constructor() { + constructor(url) { super('MongoSave'); + this._url = url; + this._mongoClient = new MongoDB.MongoClient(); + this._connectPending = false; } func(message) { + if (!this._dbh) { + log.info("Not database connection yet"); + if (!this._connectPending) { + this._connectPending = true; + this._mongoClient.connect(this._url) + .then((db) => { + log.info("Successfully opened MongoDB connect"); + this._dbh = db; + }) + .catch((err) => { + log.error(`Failure when opening MongoDB connect: ${err}`); + this._dbh = undefined; + }); + } + else { + log.info("Connecting to database is pending"); + } + } + if (this._dbh) { + log.info("Database handle is available"); + let coll = this._dbh.collection("iot"); + coll.insertOne(message) + .then((res) => { + log.info(`Successfully wrote one item in database: ${res.insertedId}`); + }) + .catch((err) => { + log.error(`Failure when trying to write one item in database: ${err}`); + }); + } + else { + log.error(`No database connection yet, drop message ${message}`); + } return "<<" + message + ">>"; } } diff --git a/npm-debug.log b/npm-debug.log new file mode 100644 index 0000000..3c5d893 --- /dev/null +++ b/npm-debug.log @@ -0,0 +1,45 @@ +0 info it worked if it ends with ok +1 verbose cli [ '/usr/bin/nodejs', '/usr/bin/npm', 'start' ] +2 info using npm@3.10.10 +3 info using node@v6.11.2 +4 verbose run-script [ 'prestart', 'start', 'poststart' ] +5 info lifecycle dispatcher@1.0.0~prestart: dispatcher@1.0.0 +6 silly lifecycle dispatcher@1.0.0~prestart: no script for prestart, continuing +7 info lifecycle dispatcher@1.0.0~start: dispatcher@1.0.0 +8 verbose lifecycle dispatcher@1.0.0~start: unsafe-perm in lifecycle true +9 verbose lifecycle dispatcher@1.0.0~start: PATH: /usr/lib/node_modules/npm/bin/node-gyp-bin:/home/wn/workspace-node/Dispatcher/node_modules/.bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/wn/.local/bin:/home/wn/bin:/opt/jdk/bin:/opt/apache-maven/bin:/home/wn/mos/bin +10 verbose lifecycle dispatcher@1.0.0~start: CWD: /home/wn/workspace-node/Dispatcher +11 silly lifecycle dispatcher@1.0.0~start: Args: [ '-c', 'node dist/main.js' ] +12 silly lifecycle dispatcher@1.0.0~start: Returned: code: 1 signal: null +13 info lifecycle dispatcher@1.0.0~start: Failed to exec start script +14 verbose stack Error: dispatcher@1.0.0 start: `node dist/main.js` +14 verbose stack Exit status 1 +14 verbose stack at EventEmitter. (/usr/lib/node_modules/npm/lib/utils/lifecycle.js:255:16) +14 verbose stack at emitTwo (events.js:106:13) +14 verbose stack at EventEmitter.emit (events.js:191:7) +14 verbose stack at ChildProcess. (/usr/lib/node_modules/npm/lib/utils/spawn.js:40:14) +14 verbose stack at emitTwo (events.js:106:13) +14 verbose stack at ChildProcess.emit (events.js:191:7) +14 verbose stack at maybeClose (internal/child_process.js:891:16) +14 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5) +15 verbose pkgid dispatcher@1.0.0 +16 verbose cwd /home/wn/workspace-node/Dispatcher +17 error Linux 4.9.0-3-amd64 +18 error argv "/usr/bin/nodejs" "/usr/bin/npm" "start" +19 error node v6.11.2 +20 error npm v3.10.10 +21 error code ELIFECYCLE +22 error dispatcher@1.0.0 start: `node dist/main.js` +22 error Exit status 1 +23 error Failed at the dispatcher@1.0.0 start script 'node dist/main.js'. +23 error Make sure you have the latest version of node.js and npm installed. +23 error If you do, this is most likely a problem with the dispatcher package, +23 error not with npm itself. +23 error Tell the author that this fails on your system: +23 error node dist/main.js +23 error You can get information on how to open an issue for this project with: +23 error npm bugs dispatcher +23 error Or if that isn't available, you can get their info via: +23 error npm owner ls dispatcher +23 error There is likely additional logging output above. +24 verbose exit [ 1, true ] diff --git a/package.json b/package.json index 772a6b8..b77e125 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "license": "ISC", "devDependencies": { "@types/chalk": "^0.4.31", + "@types/mongodb": "^2.2.10", "@types/mqtt": "0.0.34", "@types/node": "^8.0.14", "typescript": "^2.4.2" @@ -20,6 +21,7 @@ "dependencies": { "chalk": "^2.0.1", "moment": "^2.18.1", + "mongodb": "^2.2.31", "mqtt": "^2.9.2" } } diff --git a/src/main.ts b/src/main.ts index 585e51a..873b116 100644 --- a/src/main.ts +++ b/src/main.ts @@ -12,7 +12,9 @@ let dispatcher = new mqtt.MqttDispatcher("mqtts://broker.hottis.de:8883", dispatcher.register('IoT/espThermometer2/#', 'toJson', EspThermToJson.espThermToJson) -let mongo : MongoSave.MongoSave = new MongoSave.MongoSave() + +let atlasUrl = "mongodb://receiver:esp8266.@cluster0-shard-00-00-7qduq.mongodb.net:27017,cluster0-shard-00-01-7qduq.mongodb.net:27017,cluster0-shard-00-02-7qduq.mongodb.net:27017/hottis?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin" +let mongo : MongoSave.MongoSave = new MongoSave.MongoSave(atlasUrl) dispatcher.register('IoT/espThermometer2/#', 'MongoSave', mongo); diff --git a/src/mongosave.ts b/src/mongosave.ts index ff3ebca..3a7149b 100644 --- a/src/mongosave.ts +++ b/src/mongosave.ts @@ -1,12 +1,52 @@ import * as CallChain from './callchain' import * as log from './log' +import * as MongoDB from 'mongodb' + export class MongoSave extends CallChain.ABaseChainItem { - constructor() { + private _url : string + private _mongoClient : MongoDB.MongoClient + private _dbh : MongoDB.Db | undefined + private _connectPending : boolean + + constructor(url:string) { super('MongoSave') + this._url = url + this._mongoClient = new MongoDB.MongoClient() + this._connectPending = false } protected func(message : any) : any { + if (! this._dbh) { + log.info("Not database connection yet") + if (! this._connectPending) { + this._connectPending = true + this._mongoClient.connect(this._url) + .then((db:MongoDB.Db) => { + log.info("Successfully opened MongoDB connect") + this._dbh = db + }) + .catch((err) => { + log.error(`Failure when opening MongoDB connect: ${err}`) + this._dbh = undefined + }) + } else { + log.info("Connecting to database is pending") + } + } + if (this._dbh) { + log.info("Database handle is available") + let coll : MongoDB.Collection = this._dbh.collection("iot") + coll.insertOne(message) + .then((res : MongoDB.InsertOneWriteOpResult) => { + log.info(`Successfully wrote one item in database: ${res.insertedId}`) + }) + .catch((err : any) => { + log.error(`Failure when trying to write one item in database: ${err}`) + }) + } else { + log.error(`No database connection yet, drop message ${message}`) + } return "<<" + message + ">>" }