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}