Mongoose + MongoDB - 尝试使用 POSTMAN 保存后,转换为 ObjectID 的值失败

Posted

技术标签:

【中文标题】Mongoose + MongoDB - 尝试使用 POSTMAN 保存后,转换为 ObjectID 的值失败【英文标题】:Mongoose + MongoDB - Cast to ObjectID failed for value after try save with POSTMAN 【发布时间】:2019-07-18 02:41:16 【问题描述】:

我正在尝试在 mongoDB 中保存一个引用其他 2 个对象的对象,但我没有得到它。每当我尝试时,我都会收到此消息。

为此,使用 POSTMAN 来测试我正在创建的 API。


    "message": "Order validation failed: payments.0.credit_card.card: Cast to ObjectID failed for value \" number: '4898308633754712',\n  holder_name: 'Test test',\n  exp_month: 1,\n  exp_year: 2022,\n  cvv: '1234' \" at path \"credit_card.card\", customer: Cast to ObjectID failed for value \" name: 'Test Test', email: 'test@gmail.com' \" at path \"customer\""

我试图在 mongoDB 中保存的 json 对象:


  "items": [
    "name": "Plano s",
    "amount": 12345,
    "description": "Descrição do Plano Sanarflix",
    "quantity": 1
  ],
  "customer": 
    "name": "Test Test",
    "email": "test@gmail.com"
  ,
  "payments": [
    "payment_method": "credit_card",
    "credit_card": 
        "installments":1,
        "capture": true,
      "card": 
        "number": "4898308633754712",
        "holder_name": "Test Test",
        "exp_month": 1,
        "exp_year": 2022,
        "cvv": "1234"
      
    
  ]

这是我定义的模型顺序:

'use strict';

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// Model for order
const schema = new Schema(
    customer: 
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Customer',
        required: function()
            return this.customer_id;
                
    ,
    items: [
        amount: 
            type: Number,
            required: true
        ,
        description: 
            type: String,
            trim: true
        ,
        quantity: 
            type: Number,
            required: true
        
    ],
    payments: [
        payment_method: 
            type: String,
            required: true,
            trim: true
        ,
        credit_card: 
            installments: 
                type: Number,
                default: 1
            ,
            capture: 
                type: Boolean,
                default: true
            ,
            card: 
                type: mongoose.Schema.Types.ObjectId,
                ref: 'Card'
              
        ,
    ]
);

module.exports = mongoose.model('Order', schema);

它有什么问题?因为当我使用 Studio3 Mongo Manager 将相同的 json 导入 MongoDB 时,我可以将其保存并以正确的方式查看对象。

【问题讨论】:

【参考方案1】:

一个引用其他 2 个对象的对象,是的,ObjectId 确实引用了,但您传递的是整个对象。

三个选项:

传递customercard 对象的id(如果它们已经存在) 将这些新数据插入各自的集合中然后使用创建的 ID 插入您的订单(可能是解决方案) 重写您的架构,使其仅包含可容纳所有内容的 Order 集合(不是很好)。

此外,通过您的服务器传输卡号是非常危险(从法律上讲),尤其是如果您要存储它们...查看您正在实施的支付服务如何处理交易:在任何体面的服务上,服务器永远不会看到银行数据,从而使您的公司不承担任何责任。

【讨论】:

首先,感谢您回答我的问题。所以我知道卡数据不应该保存在银行或服务器上的流量中。我怎么能这样做? “重写您的架构,使其仅包含可以容纳所有内容的 Order 集合(不是很好)。” 那么您将定义Order 架构,其中card 是一个使用适当字段定义的对象(您当前必须拥有Card 架构)。对客户也一样。但这不是一个很好的解决方案:每次您想要提取客户数据(例如订单历史记录)时,您都需要汇总数据。恕我直言,您应该将它们分开,并真正插入引用客户的ObjectId。 (但是您可能希望冻结Order 中的一些客户数据,例如姓名、送货/账单地址...)

以上是关于Mongoose + MongoDB - 尝试使用 POSTMAN 保存后,转换为 ObjectID 的值失败的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mongoose 从 mongodb 中选择值

如何使用 mongoose 从 mongodb 模式中删除索引?

我无法使用 Mongoose 在 MongoDB 中保存或查找文档

如何使用 Mongoose 使用 MongoDB 事务?

错误:使用 mongoose 连接到 MongoDb Atlas 时的 queryTxt ETIMEOUT

如何使用 Mongoose 在 MongoDB 中插入 JSON 数组