TypeError: Property is not a constructor<br> at \routes\api\properties.js:20:20<
Мой запрос POST
работал нормально, когда я использовал mongoose.connect
, но, поскольку я хочу загрузить несколько изображений одновременно, мне также пришлось подключиться к GridFS
, поэтому я переключился на mongoose.createConnection
, Одна вещь, которую я не понимаю, - это как использовать мои схемы, когда я использую метод createConnection.
Я прочитал, что должен экспортировать только свои схемы и не использовать mongoose.model
на них, а вместо этого использовать conn.model
Когда я запускаю console.log(module.exports)
Я экспортирую Property = conn.model()
. Но всякий раз, когда я пытаюсь импортировать его, я получаю пустой объект.
Это мой server.js
файл
const express = require("express");
const mongoose = require("mongoose");
const path = require("path");
const bodyParser = require("body-parser");
const Grid = require("gridfs-stream");
const methodOverride = require("method-override");
const multer = require("multer");
const GridFsStorage = require("multer-gridfs-storage");
const crypto = require("crypto");
const properties = require("./routes/api/properties");
const images = require("./routes/api/images");
const { PropertySchema } = require("./models/Property");
const app = express();
//Body Parser Middleware
app.use(bodyParser.json());
//Middleware
app.use(bodyParser.json());
app.use(methodOverride("_method"));
//DB config
db = require("./config/keys").mongoURI;
//Connect to Mongo
const conn = mongoose.createConnection(db, {
useUnifiedTopology: true,
useNewUrlParser: true,
useCreateIndex: true
});
//init gfs
let gfs;
conn.once("open", () => {
console.log("Mongodb connected...");
//Init Stream
gfs = Grid(conn.db, mongoose.mongo);
gfs.collection("uploads");
});
//Create storage engine
var storage = new GridFsStorage({
url: db,
file: (req, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(16, (err, buf) => {
if (err) {
return reject(err);
}
const filename = buf.toString("hex") + path.extname(file.originalname);
const fileInfo = {
filename: filename,
bucketName: "uploads"
};
resolve(fileInfo);
});
});
}
});
const upload = multer({ storage });
const Property = conn.model("Property", PropertySchema);
module.exports = Property;
//Use routes
app.use("/api/properties", properties);
app.use("/api/uploadImages", upload.array("photos", 8), images);
const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`Server listening on port ${port}`));
\ rout \ api \ properties. js
const express = require("express");
const router = express.Router();
//Property Model
const { Property } = require("../../server");
//@route GET api/properties
//@desc GET All properties
//@access Public
router.get("/", (req, res) => {
Property.find()
.sort({ createdAt: -1 })
.then(properties => res.json(properties));
});
//@route POST api/properties
//@desc POST a property
//@access Public
router.post("/", (req, res) => {
const new_item = new Property(req.body);
new_item
.save()
.then(item => res.json(item))
.catch(err => res.json(err));
});
module.exports = router;
И мои схемы. Не обращайте внимания на ImageSchema, она устарела
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
// Create Schema
const ExtraSchema = new Schema({
name: {
type: String,
required: true
},
text: {
type: String,
required: true
}
});
const ImageSchema = new Schema({
img: {
data: Buffer,
contentType: String
}
});
const PropertySchema = new Schema({
//Price of property
price: {
type: Number,
required: true
},
//If you want to change price of property change this!
currentPrice: {
type: Number
},
//Address of property
address: {
type: String,
required: true
},
//1Bedroom 2Bedroom Studio, etc...
propertyType: {
type: String,
required: true
},
//can add sqfeet or whatever
extras: [ExtraSchema],
createdAt: {
type: Date,
default: Date.now()
},
//City of property
city: {
type: String,
required: true
},
//Description of property
description: {
type: String
},
//Number of bedrooms not required
bedrooms: {
type: Number,
default: 0
},
//Number of bathrooms not required
bathrooms: {
type: Number,
default: 0
},
//Images of the property
images: [{ type: String }],
//Meta
meta: {
likes: Number,
saves: Number
}
});
module.exports = {
PropertySchema,
ImageSchema,
ExtraSchema
};