My code is as follows and gets me "message": "Product is not a constructor"
using postman.
Router seems to be properly configured but now I don’t know what is the issue.
File product constructor
is placed at the right direction. When running node server
I get no errors in terminal.
product constructor
const mongoose = require('mongoose'); const productSchema = mongoose.Schema({ _id: mongoose.Schema.Types.ObjectId, name: String, price: Number }); module.export = mongoose.model('Product', productSchema);
Router for POSTS
const mongoose = require('mongoose'); const Product = require('../models/product'); //import schema, product constructor //POSTs to products router.post('/', (req,res,next) => { //ObjectId method to add new ID const product = new Product({ _id: new mongoose.Types.ObjectId(), name: req.body.name, price: req.body.price }); //mongoose method to save data product .save() .then(result => { console.log(result); }) .catch(err => console.log(err)); res.status(201).json({ message: 'sending POSTs to /products', createdProduct: product }); });
Advertisement
Answer
It should be module.exports
(doc), not module.export
:
module.exports = mongoose.model('Product', productSchema);
Right now your module essentially exports a default value (an empty object).
As a sidenote, Schema is expected to be used as a constructor. While the function itself is written the way it’ll recall itself with proper syntax if used without new
:
if (!(this instanceof Schema)) { return new Schema(obj, options); }
… you can both avoid this (albeit miniscule) loss of performance and, what’s more important, show the actual intent clearly:
const productSchema = new mongoose.Schema({ _id: mongoose.Schema.Types.ObjectId, name: String, price: Number });