Ошибка типа: Свойство не является конструктором <br>в \ route \ api \ properties. js: 20: 20 - PullRequest
0 голосов
/ 23 марта 2020
TypeError: Property is not a constructor<br> &nbsp; &nbsp;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
};
...