【问题标题】:Adding json response to a Map field Mongoose Node将 json 响应添加到 Map 字段 Mongoose 节点
【发布时间】:2021-06-05 22:16:30
【问题描述】:

我刚开始使用 whit 节点和猫鼬,我正在尝试创建一个用户,然后创建一个带有条带生成 id 的条带客户,并将响应保存在用户映射字段 stripeDetails 中。 这是架构:

const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({

    name: { type: String, required: true },
    email: { type: String, required: true },
    photoUrl: { type: String, required: true },
    phoneNumber: { type: String, required: false },
    address: { type: String, required: false },
    zipCode: { type: String, required: false },

    city: { type: String, required: true },
    region: { type: String, required: true },
    country: { type: String, required: true },

    isVerified: { type: Boolean, required: false, default: false },
    lastLogin: { type: Number, required: false, default: Date.now },
    
    stripeDetails: {type: Map, required: false}
},
    { timestamps: true });

module.exports = mongoose.model('User', userSchema, 'Users');

我尝试将stripeDetails 字段设置为

.then(stripeCustomer => {
                    console.log('Stripe.customer.create', stripeCustomer);

                    result.set('stripeDetails', stripeCustomer);
                    result.save();
...

但不工作..我决定更新记录的字段但有点乱..

exports.createUser = async (req, res) => {
    const user = req.body;
    console.log('User is :', user);


    /// Creat use in DB
    User.create(
        user,
        function (err, result) {
            if (err) {
                console.log('Mongoose createUser error: ', err);
                res.statut(503).send({ error: "Internal error" });
                return;
            }
            console.log('Mongoose createUser: ', result);
            res.status(200).send({
                message: "User created successfully!",
                data: result
            });

            /// Create stripe customer
            stripe.customers.create({

                "address": {
                    "city": user.city,
                    "state": user.region,
                    "country": user.country,
                    "postal_code": user.zipCode

                },
                "balance": 0,
                "created": Date.now,
                "email": user.email,
                "name": user.name,
                "phone": user.phoneNumber,
                "preferred_locales": [],
                "shipping": null,
                "tax_exempt": "none"

            })
                .then(stripeCustomer => {
                    console.log('Stripe.customer.create', stripeCustomer);

                    // save stripe details to db

                    //not working..
                    // result.set('stripeDetails', stripeCustomer);
                    // result.save();


                    // working
                    User.findByIdAndUpdate(
                        result.id,
                        {stripeDetails: stripeCustomer},
                        { new: true },
                        function(err, result) {
                            if (err) {
                                console.log('Stripe customer not updated to db: ', err);
                            }
                            if (result != null){
                            console.log('Stripe customer updated to DB', result);

                            } else {
                                console.log('Stripe customer to update not found in db ');
                            }
                        }
                    );



                })
                .catch(error => {
                    console.log('Stripe.customer.create error: ', error);
                });


        }
    );
};

当我需要删除用户时,我也无法访问 stripeDetails.id 值..

exports.deleteUserById = async (req, res) => {
    const id = req.params.id;
    User.findByIdAndDelete(
        id,
        function (err, result) {
            if (err) {
                console.log('Mongoose deleteUserById error: ', err);
                res.statur(505).send({ errro: "Internal error" });
            }
            if (result != null) {
                console.log('Mongoose deleteUserById: ', result);
                res.status(200).send({
                    message: "User found!",
                    data: result
                });

                console.log('stripe id is:  ', result.stripeDetails['id']);

                stripe.customers.del(`${result.stripeDetails['id']}`)
                    .then(stripeCustomer => {
                        console.log('Stripe.customer.delete', stripeCustomer);
                    })
                    .catch(error => {
                        console.log('Stripe.customer.delete error: ', error);
                    });



            } else {
                console.log("Mongoose deleteUserById: user not found");
                res.status(404).send({ message: "User not found" });

            }

        });
}

我可以使用 mongoose _id 作为条纹 id,但我更愿意使用它们自己的单独 id 生成器并保持 id 分开,并习惯于在 mongoose 中使用地图。你能看出我在写作和阅读stripeDetails 时做错了什么吗?

【问题讨论】:

    标签: node.js mongoose


    【解决方案1】:

    尝试将架构中的stripeDetails 更改为Object 类型:

    stripeDetails: {type: Object, required: false}
    

    现在你可以这样做了:

    .then(stripeCustomer => {
      result.stripeDetails.details = stripeCustomer;
      User.findByIdAndUpdate(result.id, result).then((result)=>{
        console.log('User updated.');
      })
    })
    

    请注意,当您使用Map 作为类型时,您应该使用.get() 访问键的值。所以尝试像这样访问stripe_id

    let stripe_id = result.stripeDetails.get("id");
    
    stripe.customers.del(stripe_id)
      .then(stripeCustomer => {
        console.log('Stripe.customer.delete', stripeCustomer);
      }) 
      .catch(error => {
        console.log('Stripe.customer.delete error: ', error);
      });
    
    

    查看here

    【讨论】:

    • 哦,我明白了.. 太好了.. 我会试一试。为了保存stripeDetails Map 字段,为什么result.set('stripeDetails', stripeCustomer); result.save(); 会抛出错误??Create 没有返回对象?
    • stripe.customers.create Stripe API?你试过console.log(stripeCustomer)吗?结果如何?
    • 我能问一下您为什么将stripeDetails 存储为Map 类型吗?您可以将其存储为类型Object,它将使查询数据库和设置更容易。
    • 我更新了我的答案。你能试试吗?另外,我想告诉你,我检查了findByIdAndDeletefindByIdAndRemove 都会在回调中返回文档。因此,您不必更换它。
    • 确实我正在使用 Stripe API。我不知道为什么,但result.set('stripeDetails', stripeCustomer); result.save();it 现在按预期工作,获取请求显示stripeDetails 字段正确填充了数据..所以不再需要findOneAndUpdate()...删除时我得到stripe id is: undefined Stripe.customer.delete error: Error: Stripe: Argument "id" must be a string, but got: undefined (on API request to DELETE /customers /{id})
    猜你喜欢
    • 2015-09-18
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    相关资源
    最近更新 更多