Let_IT_roll
Let_IT_roll

Reputation: 399

Nodejs Mongoose - Model not defined

I'm trying to send some data to a database using mongoose. Here is my code so far.

server.js

var express = require('express');
var wine = require('./routes/wines');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');

var app = express();

app.use(bodyParser.urlencoded({ extended: true}));
app.use(bodyParser.json());

app.get('/wines', wine.findAll);
app.get('/wines/:id', wine.findById);

app.listen(3000);
console.log('Listening on port 3000...');

wine.js (inside models folder)

var mongoose = require('mongoose');
var db = mongoose.connection;

var wineSchema = new mongoose.Schema({
    name: String,
    description: String
});

var Wine = mongoose.model('Wine', wineSchema);
module.exports = Wine;

wines.js (inside routes folder)

exports.addWine = function(req, res) {
// Problem not defined here
var silence = new Wine({ name: 'Silence', description:"cena" })
console.log(silence.name) // 'Silence'
// add it to the database
};

I keep getting this error and i have no idea why. ReferenceError: Wine is not defined

I've exported Wine in wine.js (models), shouldn't I be able to use it everywhere ?

Thank you in advance !

Upvotes: 4

Views: 5018

Answers (2)

Jason Cust
Jason Cust

Reputation: 10909

Exporting objects/values/functions from node modules does not make them globally available in other modules. The exported objects/values/functions are returned from require (reference here for more info). That said, Mongoose uses an internal global cache for models and schemas which make it available via mongoose (or a connection) throughout an app.

So in your routes file you could do something like:

var Wine = mongoose.model('Wine'); // Notice we don't specify a schema
exports.addWine = function(req, res) {
  var silence = new Wine({ name: 'Silence', description:"cena" })
  console.log(silence.name) // 'Silence'
  // add it to the database
};

Upvotes: 2

idleherb
idleherb

Reputation: 1101

Add var Wine = require('./../models/wine.js'); at the beginning of wines.js (assuming your routes and models folders are contained within the same directory).

Upvotes: 4

Related Questions