2016-10-29 4 views
-3

Ich folge der FULL STACK JAVASCRIPT ENTWICKLUNG MIT MEIN von Adam Bretz & Colin J. Ihrig. Als ich zu Kapitel 8 kam, konnte ich diesen Fehler nicht durchmachen, als ich versuchte, in eine Online-Mongo-Datenbank einzufügen. Muss ich eine ältere Knotenversion verwenden? Ich habe durch Stapelaustausch sehe und nicht in der Lage gewesen, um es nach all den vorgeschlagenen Korrekturen funktioniert ... Hier mein Fehler ist:TypeError: Kann Eigenschaft '_id' von undefiniertem Knoten nicht lesen js

TypeError: Cannot read property '_id' of undefined 
    at insertEmployees (/Users/kikocarisse/Desktop/NODESITES/chapter8/index.js:100:17) 
    at /Users/kikocarisse/Desktop/NODESITES/chapter8/index.js:195:5 
    at /Users/kikocarisse/Desktop/NODESITES/chapter8/index.js:79:7 
    at Function.<anonymous> (/Users/kikocarisse/Desktop/NODESITES/chapter8/node_modules/mongoose/lib/model.js:3369:16) 
    at /Users/kikocarisse/Desktop/NODESITES/chapter8/node_modules/mongoose/lib/model.js:1890:18 
    at /Users/kikocarisse/Desktop/NODESITES/chapter8/node_modules/mongoose/node_modules/async/internal/parallel.js:35:9 
    at /Users/kikocarisse/Desktop/NODESITES/chapter8/node_modules/mongoose/node_modules/async/node_modules/lodash/before.js:31:21 
    at iteratorCallback (/Users/kikocarisse/Desktop/NODESITES/chapter8/node_modules/mongoose/node_modules/async/eachOf.js:52:13) 
    at /Users/kikocarisse/Desktop/NODESITES/chapter8/node_modules/mongoose/node_modules/async/internal/onlyOnce.js:12:16 
    at /Users/kikocarisse/Desktop/NODESITES/chapter8/node_modules/mongoose/node_modules/async/internal/parallel.js:32:13 
    at apply (/Users/kikocarisse/Desktop/NODESITES/chapter8/node_modules/mongoose/node_modules/async/node_modules/lodash/_apply.js:15:25) 
    at /Users/kikocarisse/Desktop/NODESITES/chapter8/node_modules/mongoose/node_modules/async/node_modules/lodash/_overRest.js:32:12 
    at model.callbackWrapper (/Users/kikocarisse/Desktop/NODESITES/chapter8/node_modules/mongoose/lib/model.js:1865:11) 
    at next_ (/Users/kikocarisse/Desktop/NODESITES/chapter8/node_modules/mongoose/node_modules/hooks-fixed/hooks.js:89:34) 
    at fnWrapper (/Users/kikocarisse/Desktop/NODESITES/chapter8/node_modules/mongoose/node_modules/hooks-fixed/hooks.js:186:8) 
    at /Users/kikocarisse/Desktop/NODESITES/chapter8/node_modules/mongoose/lib/model.js:3369:16 

und hier ist mein Code:

"use strict"; 
var a = require('./a.js'); 
var b = new a(5); 
var mongoose = require('./node_modules/mongoose'); 
var express = require('express'); 
var app = express(); 

var bodyParser = require('./node_modules/body-parser'); 
app.use(bodyParser.urlencoded({ 
    extended: true 
})); 
app.route('/echo') 
    .all((req,res)=>{ 
     let pars = (Object.keys(req.body).length > 0)?req.body:req.query; 
     res.send(pars); 
    }); 


var Schema = mongoose.Schema; 
var db = mongoose.connection; 
var dbUrl = 'mongodb://*****:******@******:*****/****'; 

var TeamSchema = new Schema({ 
    name: { 
    type: String, 
    required: true 
    } 
}); 
var Team = mongoose.model('Team', TeamSchema); 

var EmployeeSchema = new Schema({ 
    name: { 
    first: { 
     type: String, 
     required: true 
    }, 
    last: { 
     type: String, 
     required: true 
    } 
    }, 
    team: { 
    type: Schema.Types.ObjectId, 
    ref: 'Team' 
    }, 
    image: { 
    type: String, 
    default: 'images/user.png' 
    }, 
    address: { 
    lines: { 
     type: [String] 
    }, 
    postal: { 
     type: String 
    } 
    } 
}); 

var Employee = mongoose.model('Employee', EmployeeSchema); 


db.on('error', function() { 
    console.log('there was an error communicating with the database'); 
}); 

function insertTeams (callback) { 
    Team.create([{ 
    name: 'Product Development' 
    }, { 
    name: 'Dev Ops' 
    }, { 
    name: 'Accounting' 
    }], function (error, pd, devops, acct) { 
    if (error) { 
     return callback(error); 
    } else { 
     console.info('teams successfully added') 
     callback(null, pd, devops, acct); 
    } 
    }); 
} 

function insertEmployees (pd, devops, acct, callback) { 
    Employee.create([{ 
    name: { 
     first: 'John', 
     last: 'Adams' 
    }, 
    team: pd._id, 
    address: { 
     lines: ['2 Lincoln Memorial Cir NW'], 
     postal: '20037' 
    } 
    }, { 
    name: { 
     first: 'Thomas', 
     last: 'Jefferson' 
    }, 
    team: devops._id, 
    address: { 
     lines: ['1600 Pennsylvania Avenue', 'White House'], 
     postal: '20500' 
    } 
    }, { 
    name: { 
     first: 'James', 
     last: 'Madison' 
    }, 
    team: acct._id, 
    address: { 
     lines: ['2 15th St NW', 'PO Box 8675309'], 
     postal: '20007' 
    } 
    }, { 
    name: { 
     first: 'James', 
     last: 'Monroe' 
    }, 
    team: acct._id, 
    address: { 
     lines: ['1850 West Basin Dr SW', 'Suite 210'], 
     postal: '20242' 
    } 
    }], function (error, johnadams) { 
    if (error) { 
     return callback(error); 
    } else { 
     console.info('employees successfully added'); 
     callback(null, { 
     team: pd, 
     employee: johnadams 
     }); 
    } 
    }) 
} 

function retrieveEmployee (data, callback) { 
    Employee.findOne({ 
    _id: data.employee._id 
    }).populate('team').exec(function (error, result) { 
    if (error) { 
     return callback (error); 
    } else { 
     console.log('*** Single Employee Result ***'); 
     console.dir(result); 
     callback(null, data); 
    } 
    }); 
} 

function retrieveEmployees (data, callback) { 
    Employee.find({ 
    'name.first': /J/i 
    }, function (error, results) { 
    if (error) { 
     return callback(error); 
    } else { 
     console.log('*** Multiple Employees Result ***') 
     console.dir(results); 
     callback(null, data); 
    } 
    }); 
} 

function updateEmployee (first, last, data, callback) { 
    console.log('*** Changing names ***'); 
    console.dir(data.employee); 

    var employee = data.employee; 
    employee.name.first = first; 
    employee.name.last = last 

    employee.save(function (error, result) { 
    if (error) { 
     return callback(error); 
    } else { 
     console.log('*** Changed name to Andrew Jackson ***'); 
     console.log(result); 
     callback(null, data); 
    } 
    }); 
} 

mongoose.connect(dbUrl, function (err) { 
    if (err) { 
    return console.log('there was a problem connecting to the database!' + err); 
    } 
    console.log('connected!'); 

    insertTeams(function (err, pd, devops, acct) { 
    if (err) { 
     return console.log(err) 
    } 
    insertEmployees(pd, devops, acct, function (err, result) { 

     retrieveEmployee(result, function (err, result) { 

     retrieveEmployees(result, function (err, result) { 

      updateEmployee('Andrew', 'Jackson', result, function (err, result) { 
      if (err) { 
       console.error(err); 
      } else { 
       console.info('database activity complete') 
      } 

      db.close(); 
      process.exit(); 
      }); 
     }); 
     }); 
    }); 
    }); 
}); 
+0

Zum Debuggen in Zukunft; 1. Anzeigen der Stapelverfolgung der Fehlermeldung für Dateien und Zeilennummern; 2. Navigieren Sie zur ersten Datei in dieser Zeile. 3. Log alle, wenn Ihre IDs unmittelbar davor; 4. Wenn etwas unerwartet ist, fügen Sie entweder Logik hinzu, um es dort einzufangen, oder gehen Sie eine Ebene des Stack-Trace zurück und wiederholen Sie es –

Antwort

1

In Zeile 100 ist die devops Variable undefined und deshalb erhalten Sie Ihren Fehler. Sehen Sie, dass unter insertTeams Funktion ist, wo Sie zuerst Ihre Devops-Wert erhalten, wenn Sie die Teams erstellen.

Dies ist wahrscheinlich, warum Sie dort erstellen Rückruf ist wie folgt: function (error, pd, devops, acct) aber sehen Mongoose docs, übergeben Sie ein Array als zweites Argument von create.

Versuchen Sie folgendes:

function insertTeams (callback) { 
    Team.create([{ 
    name: 'Product Development' 
    }, { 
    name: 'Dev Ops' 
    }, { 
    name: 'Accounting' 
    }], function (error, teams) { 
    if (error) { 
     console.log(error); 
     return callback(error); 
    } else { 
     console.info('teams successfully added') 
     callback(null, teams[0], teams[1], teams[2]); 
    } 
    }); 
} 

Beachten Sie, dass es jetzt eine Reihe bekommt und APSS es Elemente ist auf den Rückruf, auch feststellen, dass ich ein Protokoll hinzugefügt haben, wenn es einen Fehler Sie in der Lage sind zu sehen, wo es passierte.

Es wäre auch hilfreich, wenn Sie die Fehlerprotokolle lesen und auf die Zeileninhalte zeigen, in denen der Fehler auftritt. Sehen Sie, dass wir hier keine Zeilennummern haben und es schwieriger ist, die Fehler zu finden.

Verwandte Themen