Reputation: 107
I saw a few questions like mine but couldn't find any solutions that worked so I thought I'd ask.
I'm trying to pull all my data from my database so I can select parts of it in my app. I had my database working fine but when I tried to pull the pictures it failed and keeps giving me this error and also does not seem to receive the data from the database:
TypeError: Cannot read property 'find' of undefined
I have mongoose installed and everything connects so I can't figure out why it won't recognize the find property. My code is below if anyone has any ideas.
// Dependencies
var express = require("express");
var bodyParser = require("body-parser");
var mongoose = require("mongoose");
var exphbs = require("express-handlebars");
var request = require("request");
// var weapons = require("./weapons.js");
// Set mongoose to leverage built in JavaScript ES6 Promises
mongoose.Promise = Promise;
// Initialize Express
var app = express();
// Use morgan and body parser with our app
app.use(bodyParser.urlencoded({
extended: false
}));
// Make public a static dir
app.use(express.static(__dirname + "/public"));
app.engine("handlebars", exphbs({ defaultLayout: "main" }));
app.set("view engine", "handlebars");
// Database configuration with mongoose
mongoose.connect("mongodb://localhost/weaponsdb");
var db = mongoose.connection;
// Show any mongoose errors
db.on("error", function(error) {
console.log("Mongoose Error: ", error);
});
// Once logged in to the db through mongoose, log a success message
db.once("open", function() {
console.log("Mongoose connection successful.");
});
//routes to home page
app.get('/', function(req, res, next){
res.render("index",{ title: 'Express' });
});
app.get('/app', function(req, res, next){
res.render("app",{ layout: 'applayout' });
});
app.get("/all", function(req, res) {
// Query: In our database, go to the weapon collection, then "find" everything
db.weapon.find({}, function(error, found) {
// Log any errors if the server encounters one
if (error) {
console.log(error);
}
// Otherwise, send the result of this query to the browser
else {
res.json(found);
}
});
});
$.getJSON("/all", function(data) {
console.log(data)
// For each entry of that json...
for (var i = 0; i < data.length; i++) {
// Append each of the weapons' properties to the table
$("#results").append("<img src = " + data[i].Picture + " />");
}
});
Upvotes: 5
Views: 24967
Reputation: 107
For those of you who were interested I figured out the problem.
The issue was the lack of schema which I resolved but also the collection name in mongodb needed to be a plural and not a singular (so weapons not weapon).
Upvotes: 4
Reputation: 1723
If you are using mongoose
you should define a schema
to your collection, and than you can refer to that schema:
var weaponSchema = mongoose.Schema({
.... your model definition here ....
});
var Weapon = mongoose.model('weapon', weaponSchema);
Than you can do:
Weapon.find({})........
Upvotes: 5