#javascript #node.js #mongodb #express
#javascript #node.js #mongodb #выразить
Вопрос:
Мой код выглядит следующим образом и заставляет меня "message": "Product is not a constructor"
использовать postman. Кажется, что маршрутизатор настроен правильно, но теперь я не знаю, в чем проблема. Файл product constructor
размещен в правильном направлении. При запуске node server
я не получаю ошибок в терминале.
конструктор продукта
const mongoose = require('mongoose');
const productSchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
name: String,
price: Number
});
module.export = mongoose.model('Product', productSchema);
Маршрутизатор для СООБЩЕНИЙ
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
});
});
Комментарии:
1. В качестве реального примечания ваш код отправляет 201 до того, как продукт был либо сохранен, либо отклонен DB, что может быть не тем, что вы на самом деле хотите. По крайней мере,
res.status().json()
call должен быть помещен внутрьthen
;async/await
обеспечивает лучший способ выражения того же намерения.2. Спасибо, я скоро их внедрю 🙂
Ответ №1:
Это должно быть module.exports
(doc), а не module.export
:
module.exports = mongoose.model('Product', productSchema);
Прямо сейчас ваш модуль по существу экспортирует значение по умолчанию (пустой объект).
В качестве примечания ожидается, что Schema будет использоваться в качестве конструктора. В то время как сама функция написана так, как она будет напоминать о себе с правильным синтаксисом, если используется без new
:
if (!(this instanceof Schema)) {
return new Schema(obj, options);
}
… вы можете избежать этой (хотя и незначительной) потери производительности и, что более важно, четко показать фактическое намерение:
const productSchema = new mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
name: String,
price: Number
});
Комментарии:
1. Кажется, переопределение
productSchema
const потребует дальнейшей перестройки с моей стороны, так как теперь я получаю"message": "product is not defined"
ошибку.2. Не уверен, что я понял вашу точку зрения. Не могли бы вы задать еще один вопрос (чтобы не вводить слишком много информации в этот)?
3. Можно ли общаться в Stackoverflow? Я мог бы отправить вам весь код.
4. Это не так, как должно работать SO. ) Если у вас есть вопрос, вы публикуете его, чтобы любой (а не только я) мог помочь вам — и другим людям, если у них такая же проблема.
Ответ №2:
Вероятно, вам следует создать экземпляр схемы
const productSchema = /*(this --->)*/ new mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
name: String,
price: Number
});