如何修复猫鼬中的“铸造到嵌入失败,无法实现价值”错误

时间:2019-06-13 19:44:58

标签: node.js mongodb express mongoose

我已经为用户创建了一个架构,在该架构中,我具有其中一个属性作为“订单”,其值设置为另一个架构。我无法更新“订单”属性中的文档。它显示一个错误,提示“铸造到嵌入式失败” {订单号:6788444,\ n orderDate:\ '30 -08-2018 \',\ norderedItem:{名称:\'Gamepad \'},\ n价格:599}在路径“ orders”上。 '

我最初以为是因为使用了'findByIdAndUpdate'而发生了问题,但这不是问题。后来,我没有将“ orders”值设置为另一个模式,而是在属性本身中设置了所有值,但是它不起作用。

这是userSchema和ordersSchema:-

import {Schema, Document } from 'mongoose';
import * as  mongoose from 'mongoose';

interface userInfo extends Document{
    name: string,
    username: string,
    password: string,
    orders : [{
        orderNumber: string,
        orderDate: string | Date,
        orderedItem: {
            name: string
        },
        price: number
    }],
    email: string,
    address: string,
    subscription: boolean
}

let orderSchema : Schema = new Schema({
    orderNumber: {
        type: Number,
        required: true
    },
    orderDate:{
        type: Date,
        required: true
    },
    orderedItem: {
        name: {
            type: String,
            required: true
        }
    },
    price: {
        type: Number,
        required: true
    }
})

let userSchema : Schema = new Schema({
    name: {
        type: String,
        required: true
    },
    username: {
        type: String,
        required: true
    },
    password:{
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true
    },
    address: {
        type:String
    },
    subscription:{
        type: Boolean
    },
    orders: [orderSchema]
});

let UserModel = mongoose.model<userInfo>('User', userSchema);


export {UserModel};

这是我尝试更新子文档的代码:-

import {UserModel} from '../models/user';
import * as express from 'express';
const router = express.Router();

router.put('/newOrder/:id', async(req: Request, res: Response)=> {
    let newOrder = {
        orderNumber: req.body.orderNumber,
        orderDate: req.body.orderDate,
        orderedItem: req.body.orderedItem,
        price: req.body.price
     };



    const user = await UserModel.findOneAndUpdate({_id: req.params.id}, {$push:{orders: newOrder}}, {new: true});

    res.send(user);

})

以下是我在邮递员中提供的值:-

{
    "orderNumber": 6788444,
    "orderDate": "30-08-2018",
    "orderedItem": {
        "name": "Gamepad"
    },
    "price": 599

}

错误为“ CastError:投射到值的嵌入失败” {orderNumber:6788444,\ n orderDate:\ '30 -08-2018 \',\ norderedItem:{名称:\'Gamepad \'},\ n价格:599}”,位于路径“订单”“

1 个答案:

答案 0 :(得分:0)

在userInfo界面中,orderNumber的数据类型指定为字符串。

interface userInfo extends Document{
    name: string,
    username: string,
    password: string,
    orders : [{
        orderNumber: string,
        orderDate: string | Date,
        orderedItem: {
            name: string
        },
        price: number
    }],
    email: string,
    address: string,
    subscription: boolean
}

而在您的orderSchema中,它被指定为数字。 将界面中的数据类型更改为数字

orders : [{
        orderNumber: number,
        orderDate: string | Date,
        orderedItem: {
            name: string
        },
        price: number
    }]

应该可以。