Node example with Realm and Express/Winston to demonstrate interprocess communication.
This commit is contained in:
parent
c8e4dc39c0
commit
6b6b2fa11a
|
@ -0,0 +1,22 @@
|
||||||
|
# Realm-JS Interprocess Example
|
||||||
|
Small example of interprocess support with Realm and Node.js
|
||||||
|
|
||||||
|
The example makes use of [Winston](https://github.com/winstonjs/winston), a
|
||||||
|
logging library, and includes `winston-realm.js` which defines a custom transport
|
||||||
|
utilizing Realm for storage. The main file, `index.js` is a basic
|
||||||
|
[Express](https://github.com/expressjs/express) app. The app listens on port
|
||||||
|
3000 and responds with "Hello World!" at the base path `/` and logs at `info`
|
||||||
|
"Handled Hello World" to Winston. At any other path it returns a `404` error and
|
||||||
|
logs an error message to Winston with URL in question.
|
||||||
|
|
||||||
|
Since the log messages are being stored in a Realm (`winston.realm`), we can
|
||||||
|
listen for changes on another process. The `listener.js` is a small example of
|
||||||
|
this. When running, this listens to the `winston.realm` for changes and writes
|
||||||
|
to the console the latest error level log message.
|
||||||
|
|
||||||
|
To test:
|
||||||
|
|
||||||
|
1. `npm install`
|
||||||
|
2. `node .` to run the Express app
|
||||||
|
3. In another process: `node listener.js`
|
||||||
|
4. Go to `http://localhost:3000/whatever` to see error message across processes
|
|
@ -0,0 +1,25 @@
|
||||||
|
var express = require('express'),
|
||||||
|
util = require('util'),
|
||||||
|
winston = require('winston');
|
||||||
|
RealmWinston = require('./winston-realm').Realm;
|
||||||
|
|
||||||
|
var app = express();
|
||||||
|
|
||||||
|
// Use custom Winston transport: RealmWinston
|
||||||
|
// Writes log data to winston.realm
|
||||||
|
winston.add(RealmWinston, {});
|
||||||
|
|
||||||
|
app.get('/', function (req, res) {
|
||||||
|
res.send('Hello World!');
|
||||||
|
winston.info('Handled Hello World');
|
||||||
|
});
|
||||||
|
|
||||||
|
app.use(function (req, res, next) {
|
||||||
|
res.status(404).send('Sorry can not find that!');
|
||||||
|
winston.error('404 Error at: ' + req.url);
|
||||||
|
})
|
||||||
|
|
||||||
|
app.listen(3000, function () {
|
||||||
|
console.log('Example app listening on port 3000!');
|
||||||
|
});
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var Realm = require('realm');
|
||||||
|
|
||||||
|
let winstonRealm = new Realm({
|
||||||
|
path: 'winston.realm'
|
||||||
|
});
|
||||||
|
|
||||||
|
// Register listener to print out log messages at error level
|
||||||
|
winstonRealm.objects('Log').filtered('level = "error"').addListener((logs, changes) => {
|
||||||
|
changes.insertions.map((index) => {
|
||||||
|
let log = logs[index];
|
||||||
|
console.log(log.message);
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"name": "winston-realm-test",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"dependencies": {
|
||||||
|
"express": "^4.14.0",
|
||||||
|
"winston": "^2.3.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {},
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var util = require('util'),
|
||||||
|
winston = require('winston'),
|
||||||
|
Realm = require('realm');
|
||||||
|
|
||||||
|
var RealmLogger = exports.Realm = function (options) {
|
||||||
|
winston.Transport.call(this, options);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Configure the Realm`
|
||||||
|
//
|
||||||
|
let LogSchema = {
|
||||||
|
name: 'Log',
|
||||||
|
properties: {
|
||||||
|
level: 'string',
|
||||||
|
message: 'string',
|
||||||
|
timestamp: 'date',
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.realm = new Realm({
|
||||||
|
path: 'winston.realm',
|
||||||
|
schema: [LogSchema]
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Inherit from `winston.Transport` so you can take advantage
|
||||||
|
// of the base functionality and `.handleExceptions()`.
|
||||||
|
//
|
||||||
|
util.inherits(RealmLogger, winston.Transport);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Expose the name of this Transport on the prototype
|
||||||
|
//
|
||||||
|
RealmLogger.prototype.name = 'realm';
|
||||||
|
|
||||||
|
//
|
||||||
|
// Define a getter so that `winston.transports.Realm`
|
||||||
|
// is available and thus backwards compatible.
|
||||||
|
//
|
||||||
|
winston.transports.Realm = RealmLogger;
|
||||||
|
|
||||||
|
//
|
||||||
|
// ### function log (level, msg, [meta], callback)
|
||||||
|
// #### @level {string} Level at which to log the message.
|
||||||
|
// #### @msg {string} Message to log
|
||||||
|
// #### @meta {Object} **Optional** Additional metadata to attach
|
||||||
|
// #### @callback {function} Continuation to respond to when complete.
|
||||||
|
// Core logging method exposed to Winston. Metadata is optional.
|
||||||
|
//
|
||||||
|
RealmLogger.prototype.log = function (level, msg, meta, callback) {
|
||||||
|
let ts = new Date();
|
||||||
|
|
||||||
|
this.realm.write(() => {
|
||||||
|
this.realm.create('Log', {level: level, message: msg, timestamp: ts});
|
||||||
|
});
|
||||||
|
|
||||||
|
callback(null, true);
|
||||||
|
};
|
||||||
|
|
Loading…
Reference in New Issue