mongoose mongodb result fields appear undefined in javascript

mongoose mongodb result fields appear undefined in javascript  using -'javascript,mongodb,mongoose,javascript-objects,function-prototypes'

Is there something that I'm missing that would allow item to log as an object with a parameter, but when I try to access that parameter, it's undefined?

What I've tried so far:

console.log(item) => { title: "foo", content: "bar" } , that's fine
console.log(typeof item) => object
console.log(item.title) => "undefined"

I'll include some of the context just in case it's relevant to the problem.

var TextController = function(myCollection) {
  this.myCollection = myCollection

TextController.prototype.list = function(req, res, next) {
  this.myCollection.find({}).exec(function(err, doc) {
    var set = new Set([])
    doc.forEach(function(item) {
      console.log(item)         // Here item shows the parameter
      console.log(item.title)   // "undefined"

Based on suggestion I dropped debugger before this line to check what item actually is via the node repl debugger.  This is what I found :

From this I tried console.log(item._doc.title) and it works just fine.. So, this seems more like a mongoose question now than anything.

There are questions similar to this, but they seem to be related to 'this' accessing of objects or they're trying to get the object outside the scope of the function.  In this case, I don't think I'm doing either of those, but inform me if I'm wrong. Thanks

asked Sep 29, 2015 by patilkiran.101
0 votes

4 Answers

0 votes

Try performing a for in loop over item and see if you can access values.

for (var k in item) {

If it works, it would mean your keys have some non-printable characters or something like this.

From what you said in the comments, it looks like somehow item is an instance of a String primitive wrapper.


var s = new String('test');
typeof s; //object
s instanceof String; //true

To verify this theory, try this:

eval('(' + item + ')').title;

It could also be that item is an object that has a toString method that displays what you see.

EDIT: To identify these issues quickly, you can use console.dir instead of console.log, since it display an interactive list of the object properties. You can also but a breakpoint and add a watch.

answered Sep 29, 2015 by manju bhargava
0 votes

You don't have whitespace or funny characters in ' title', do you? They can be defined if you've quoted identifiers into the object/map definition. For example:

var problem = {
    ' title': 'Foo',
    'content': 'Bar'

That might cause console.log(item) to display similar to what you're expecting, but cause your undefined problem when you access the title property without it's preceding space.

answered Sep 29, 2015 by sujata naik
0 votes

Are you initializing your object?

function MyObject()
    this.Title = "";
    this.Content = "";

var myo1 = new MyObject();

If you do not initialize or have not set a title. You will get undefined.

answered Sep 29, 2015 by rajeshujade
0 votes

I think using 'find' method returns an array of Documents.I tried this and I was able to print the title

for (var i = 0; i < doc.length; i++) {
   console.log("iteration " + i);
   console.log('ID:' + docs[i]._id);
answered Sep 29, 2015 by patelnikul321