0

I have a typical Node.js, express, mongoDB and mongoose application.

I'm trying to implement the mongoose-observer library to listen for changes on my mongodb. See site: https://www.npmjs.com/package/mongoose-observer

When adding this code (almost exactly like the provided example):

mongooseObserver.register('MessageModel', 'create', function(newMessage) {
    console.log("New Message!");
    console.log(newMessage);
});

I get the following error:

    node_1     | /home/app/chat/node_modules/mongoose/lib/index.js:362
    node_1     |       throw new mongoose.Error.MissingSchemaError(name);
    node_1     |       ^
    nodered_1  | 28 Mar 07:32:11 - [info] Starting flows
    mongo_1    | 2017-03-28T07:32:04.562+0000 I NETWORK  [thread1] waiting for connections on port 27017
    node_1     | MissingSchemaError: Schema hasn't been registered for model "MessageModel".
    node_1     | Use mongoose.model(name, schema)
    node_1     |     at Mongoose.model (/home/app/chat/node_modules/mongoose/lib/index.js:362:13)
    node_1     |     at registerPre (/home/app/chat/node_modules/mongoose-observer/index.js:9:27)
    node_1     |     at Object.register (/home/app/chat/node_modules/mongoose-observer/index.js:38:9)
    node_1     |     at module.exports (/home/app/chat/app/routes.js:35:22)
    node_1     |     at Object.<anonymous> (/home/app/chat/server.js:83:24)
    node_1     |     at Module._compile (module.js:409:26)
    node_1     |     at Object.Module._extensions..js (module.js:416:10)
    node_1     |     at Module.load (module.js:343:32)
    node_1     |     at Function.Module._load (module.js:300:12)
    node_1     |     at Function.Module.runMain (module.js:441:10)
    node_1     |     at startup (node.js:134:18)
    node_1     |     at node.js:962:3
    mongo_1    | 2017-03-28T07:32:11.604+0000 I NETWORK  [thread1] connection accepted from 172.25.0.1:51800 #1 (1 connection now open)

This error only happens when adding the mongoose-observer code, without that is works just fine.

Other code that might be relevant

var mongooseObserver = require('mongoose-observer');
var mongoose         = require('mongoose');
var bcrypt           = require('bcrypt'),
    SALT_WORK_FACTOR = 10;

mongoose.connect('mongodb://mongo:27017/LoRaMessages'); //database name

var messageSchema = mongoose.Schema({
    DevEUI: String,
    LoRaPayload: String,
    Header: String,
    Longitude: Number,
    Latitude: Number,
    PDOP: Number,
    TMG: Number,
    SOG: Number,
    Temparature: Number,
    Time: String,
    ServerTime: Number,
    type: String,
    deviceType: String,
    batteryLevel: String,
    JoinedAndBeeperStatus: String,
    EnabledFlags: Number,
    AlarmFlags: Number,
    T_Temp: Number,
    H_Humi: Number,
    One_Temp: Number, 
    Two_Temp: Number,
    _msgid: String        
});

var MessageModel = mongoose.model('loramessages', messageSchema);  //collection name

mongooseObserver.register('MessageModel', 'create', function(newMessage) { //it fails on this line
    console.log("New Message!");
    console.log(newMessage);
});

I know this library is not used by a lot of people but maybe i'm missing something obvious.

I have seen the other post containing this error but there seems to be another problem since this only happens when implementing the specific library code.

Any help is appreciated.

EDIT: While @Love-Kesh 's answer was correct. I found out this library is only for listening for changes from within Node.js, externally added data is not detected.

Jan
  • 560
  • 6
  • 19
  • Make sure your Observer.register function executing after schema defined means schema file is running before this function. – Love-Kesh Mar 28 '17 at 08:25
  • @Love-Kesh Thanks for your comment. But what do you mean by 'running'? I've defined the schema and model before defining the observer function. – Jan Mar 28 '17 at 08:30
  • 1
    yes you did. Pass 'loramessages' instead 'MessageModel' in Observer.register – Love-Kesh Mar 28 '17 at 08:34
  • @Love-Kesh that solved the error, thanks! Next problem: it doesn't do what it should do. When adding a new message to the database, the observer function is not fired. Should this be a new SO question? – Jan Mar 28 '17 at 08:45

1 Answers1

1

Pass 'loramessages' instead 'MessageModel' in Observer.register

If you are using save to create new item , it won't fire , please use Model.create({}) to create new record.

//Try if Save event listener available there

Observer.register('loramessages', 'save', function(createdUser){
    // this callback will be executed when a new user is created
    // Do something here, for example, send a email to the created user
  });
Love-Kesh
  • 777
  • 7
  • 17
  • is save listener available there or you created using Model.create() @Jan – Love-Kesh Mar 28 '17 at 09:04
  • There is no 'save' listener available, but 'create' fires when a new document is saved. This library does not solve my initial problem because my data is added externally (not from within node.js). – Jan Mar 28 '17 at 11:39
  • Could you change "save" to "create" since "save" is not an option provided by the library? – Jan Mar 28 '17 at 11:40