Mongoose returns 用 req.body 实例化的空对象
Mongoose returns empty object instantiated with req.body
美好的一天!
Invoice 模型嵌套了 Item 数组,我正在用 req.body 实例化新的 Item 对象 来自 newItem.ejs 但 Mongoose 返回空对象,即使 req.body 不为空。
如有任何建议,我们将不胜感激!
index.js
const express = require('express');
const app = express();
const path = require('path');
const mongoose = require('mongoose');
const Invoice = require('./model/invoice');
const Item = require('./model/invoice');
const bodyParser = require('body-parser')
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.post('/invoice/:id/newItem', (req, res) => {
const { id } = req.params;
const newItem = new Item(req.body);
console.log(req.body); // returns {barcode: '666666', vendorRef: 'test', name: 'test', color: 'test' size: '6', cost: '6', quantity: '6'}
console.log(newItem); // returns { _id: new ObjectId("61d18085424a77e2159b4e38"), items: [] }
Invoice.findByIdAndUpdate(
{_id: id},
{$push: { items: newItem}}).
then(() => {
console.log("Item Added")
})
.catch((err) => {
console.log('Error');
console.log(err);
})
res.redirect(`/search/${id}`);
})
上面的评论表明 req.body 不是空的,但对象只返回了 id。
型号
const mongoose = require('mongoose');
const itemSchema = new mongoose.Schema({
barcode: Number,
vendorRef: String,
name: String,
color: String,
size: Number,
cost: Number,
quantity: Number
})
const invoiceSchema = new mongoose.Schema({
invoiceNumber: {
type: Number,
required: true
},
invoiceDate: {
type: Date,
required: true
},
vendor: {
type: String,
required: true
},
store: {
type: String,
required: true
},
onDelivery: Boolean,
deliveryDate: Date,
received: Boolean,
receivedDate: Date,
posUpdated: Boolean,
posUpdatedDate: Date,
items: [itemSchema]
})
const Item = mongoose.model('Item', itemSchema);
const Invoice = mongoose.model('Invoice', invoiceSchema);
module.exports = Item;
module.exports = Invoice;
newItem.ejs
<form action="/invoice/<%= invoice._id %>/newItem" method="post">
<label for="barcode">Barcode</label>
<input type="number" id="barcode" name="barcode"> <br>
<label for="vendorRef">VendorRef</label>
<input type="text" id="vendorRef" name="vendorRef"> <br>
<label for="name">Name</label>
<input type="text" id="name" name="name"> <br>
<label for="color">Color</label>
<input type="text" id="color" name="color"> <br>
<label for="size">Size</label>
<input type="number" id="size" name="size"> <br>
<label for="cost">Cost</label>
<input type="number" id="cost" name="cost"> <br>
<label for="quantity">Quantity</label>
<input type="number" id="quantity" name="quantity"> <br>
<button>Add</button>
</form>
您从 invoice.js 文件导出值的方式不正确。您正在将 module.exports
的值重新分配给 Invoice,这就是为什么只导出该架构的原因。
因此您将错误的模型导入了 Item
。您可以将 Item
模式分离到它自己的文件中,这样可以更好地构建事物,即。将 Item 架构的代码移至 item.js
// file: models/item.js
const mongoose = require('mongoose');
const itemSchema = new mongoose.Schema({
barcode: Number,
vendorRef: String,
name: String,
color: String,
size: Number,
cost: Number,
quantity: Number
});
const Item = mongoose.model('Item', itemSchema);
module.exports = {Item, itemSchema};
// file: models/invoice.js
const mongoose = require('mongoose');
const {itemSchema} = require("./item.js");
const invoiceSchema = new mongoose.Schema({
invoiceNumber: {
type: Number,
required: true
},
invoiceDate: {
type: Date,
required: true
},
vendor: {
type: String,
required: true
},
store: {
type: String,
required: true
},
onDelivery: Boolean,
deliveryDate: Date,
received: Boolean,
receivedDate: Date,
posUpdated: Boolean,
posUpdatedDate: Date,
items: [itemSchema]
})
const Invoice = mongoose.model('Invoice', invoiceSchema);
module.exports = {Invoice, invoiceSchema};
// file: index.js
const { Invoice } = require('./model/invoice');
const { Item } = require('./model/item');
或
您可以在一行中解构同一文件中的模式
const express = require('express');
const app = express();
const path = require('path');
const mongoose = require('mongoose');
const { Invoice, Item }= require('./model/invoice'); // This line
// const = require('./model/invoice');// Get rid of this
const bodyParser = require('body-parser')
要执行此操作,您还必须将 invoice.js
中的导出行更改为
module.exports = {Item, Invoice}
美好的一天!
Invoice 模型嵌套了 Item 数组,我正在用 req.body 实例化新的 Item 对象 来自 newItem.ejs 但 Mongoose 返回空对象,即使 req.body 不为空。
如有任何建议,我们将不胜感激!
index.js
const express = require('express');
const app = express();
const path = require('path');
const mongoose = require('mongoose');
const Invoice = require('./model/invoice');
const Item = require('./model/invoice');
const bodyParser = require('body-parser')
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.post('/invoice/:id/newItem', (req, res) => {
const { id } = req.params;
const newItem = new Item(req.body);
console.log(req.body); // returns {barcode: '666666', vendorRef: 'test', name: 'test', color: 'test' size: '6', cost: '6', quantity: '6'}
console.log(newItem); // returns { _id: new ObjectId("61d18085424a77e2159b4e38"), items: [] }
Invoice.findByIdAndUpdate(
{_id: id},
{$push: { items: newItem}}).
then(() => {
console.log("Item Added")
})
.catch((err) => {
console.log('Error');
console.log(err);
})
res.redirect(`/search/${id}`);
})
上面的评论表明 req.body 不是空的,但对象只返回了 id。
型号
const mongoose = require('mongoose');
const itemSchema = new mongoose.Schema({
barcode: Number,
vendorRef: String,
name: String,
color: String,
size: Number,
cost: Number,
quantity: Number
})
const invoiceSchema = new mongoose.Schema({
invoiceNumber: {
type: Number,
required: true
},
invoiceDate: {
type: Date,
required: true
},
vendor: {
type: String,
required: true
},
store: {
type: String,
required: true
},
onDelivery: Boolean,
deliveryDate: Date,
received: Boolean,
receivedDate: Date,
posUpdated: Boolean,
posUpdatedDate: Date,
items: [itemSchema]
})
const Item = mongoose.model('Item', itemSchema);
const Invoice = mongoose.model('Invoice', invoiceSchema);
module.exports = Item;
module.exports = Invoice;
newItem.ejs
<form action="/invoice/<%= invoice._id %>/newItem" method="post">
<label for="barcode">Barcode</label>
<input type="number" id="barcode" name="barcode"> <br>
<label for="vendorRef">VendorRef</label>
<input type="text" id="vendorRef" name="vendorRef"> <br>
<label for="name">Name</label>
<input type="text" id="name" name="name"> <br>
<label for="color">Color</label>
<input type="text" id="color" name="color"> <br>
<label for="size">Size</label>
<input type="number" id="size" name="size"> <br>
<label for="cost">Cost</label>
<input type="number" id="cost" name="cost"> <br>
<label for="quantity">Quantity</label>
<input type="number" id="quantity" name="quantity"> <br>
<button>Add</button>
</form>
您从 invoice.js 文件导出值的方式不正确。您正在将 module.exports
的值重新分配给 Invoice,这就是为什么只导出该架构的原因。
因此您将错误的模型导入了 Item
。您可以将 Item
模式分离到它自己的文件中,这样可以更好地构建事物,即。将 Item 架构的代码移至 item.js
// file: models/item.js
const mongoose = require('mongoose');
const itemSchema = new mongoose.Schema({
barcode: Number,
vendorRef: String,
name: String,
color: String,
size: Number,
cost: Number,
quantity: Number
});
const Item = mongoose.model('Item', itemSchema);
module.exports = {Item, itemSchema};
// file: models/invoice.js
const mongoose = require('mongoose');
const {itemSchema} = require("./item.js");
const invoiceSchema = new mongoose.Schema({
invoiceNumber: {
type: Number,
required: true
},
invoiceDate: {
type: Date,
required: true
},
vendor: {
type: String,
required: true
},
store: {
type: String,
required: true
},
onDelivery: Boolean,
deliveryDate: Date,
received: Boolean,
receivedDate: Date,
posUpdated: Boolean,
posUpdatedDate: Date,
items: [itemSchema]
})
const Invoice = mongoose.model('Invoice', invoiceSchema);
module.exports = {Invoice, invoiceSchema};
// file: index.js
const { Invoice } = require('./model/invoice');
const { Item } = require('./model/item');
或
您可以在一行中解构同一文件中的模式
const express = require('express');
const app = express();
const path = require('path');
const mongoose = require('mongoose');
const { Invoice, Item }= require('./model/invoice'); // This line
// const = require('./model/invoice');// Get rid of this
const bodyParser = require('body-parser')
要执行此操作,您还必须将 invoice.js
中的导出行更改为
module.exports = {Item, Invoice}