首页 > 解决方案 > Firestore云功能在一个字段中添加多个字段

问题描述

我有一个字段名称“选项”,该字段本身包含 8 个不同的复选框值。我正在使用 nodejs 编写 firestore 云函数,以在存在此字段“选项”的集合中发布数据。到目前为止,这就是我写的

exports.addCourse = functions.https.onRequest((req, res) => {
    res.set('Access-Control-Allow-Origin', 'http://localhost:4200');
    res.set('Access-Control-Allow-Methods', 'GET', 'POST');
    res.set('Access-Control-Allow-Headers', 'Content-Type'); 
    if(req.method === 'OPTIONS') {
        res.end();
    }
    else 
    {
        if (req.body.name != null && req.body.type != null && req.body.discipline != null && req.body.price_options != null
            && req.body.price != null && req.body.addon_prompt != null && req.body.addons != null && req.body.ship_price != null
            && req.body.keycode_bank != null && req.body.card_type != null && req.body.options != null && req.body.certificate_prompt != null
            && req.body.student_to_instructor_ratio != null && req.body.student_to_manikin_ratio != null && req.body.electronic_signature != null
            || req.body.name != undefined && req.body.type != undefined && req.body.discipline != undefined && req.body.price_options != undefined
            && req.body.price != undefined && req.body.addon_prompt != undefined && req.body.addons != undefined && req.body.ship_price != undefined
            && req.body.keycode_bank != undefined && req.body.card_type != undefined && req.body.options != undefined && req.body.certificate_prompt != undefined
            && req.body.student_to_instructor_ratio != undefined && req.body.student_to_manikin_ratio != undefined && req.body.electronic_signature != undefined ) {
            let docId = Math.floor(Math.random() * (99999 - 00000));
            let newCourse = {
                "name": req.body.name,
                "type": req.body.type, //1: Classroom session enabled 2. No Classroom session 
                "discipline": req.body.discipline,
                "price_options": req.body.price_options, //Registrations allowed with deposits or not?
                "price": req.body.price,
                "addon_prompt": req.body.addon_prompt,
                "addons": req.body.addons, //add addons api values will be sent here 
                "ship_price": req.body.ship_price,
                "keycode_bank": req.body.keycode_bank, //Keycode bank value will be sent here
                "card_type": req.body.card_type, //Card type value will be sent here
                "options": {
                    "certificate_prompt": req.body.certificate_prompt,
                    "student_to_instructor_ratio": req.body.student_to_instructor_ratio,
                    "student_to_manikin_ratio": req.body.student_to_manikin_ratio,
                    "electronic_signature": req.body.electronic_signature
                }
            }
            usersCourses.add(newCourse).then(snapshot => {
                res.send(200, {
                    "message": "Course was successfully created"
                })
            });


        } else {
            res.send(400, {
                "message": "All fields are required"
            })
        }
    }
});

部署了这个 API,然后用 Postman 打了它,但得到一个错误,“所有字段都是必需的”。我究竟做错了什么?这是在“选项”字段中添加多个字段的正确方法吗?

我通过邮递员发送的数据不是真实的,因为没有为 API 中的属性提供特定的数据类型

数据

{
    "name": "req.body.name",
    "type": "req.body.type", 
    "discipline": "req.body.discipline",
    "price_options": "req.body.price_options",
    "price": "req.body.price",
    "addon_prompt": "req.body.addon_prompt",
    "addons": "req.body.addons",
    "ship_price": "req.body.ship_price",
    "keycode_bank": "req.body.keycode_bank", 
    "card_type": "req.body.card_type", 
    "options": {
        "certificate_prompt": "req.body.certificate_prompt",
        "student_to_instructor_ratio": "req.body.student_to_instructor_ratio",
        "student_to_manikin_ratio": "req.body.student_to_manikin_ratio",
        "electronic_signature": "req.body.electronic_signature"
    },
    "ceu_credits": "req.body.ceu_credits",
    "description": "req.body.description",
    "confirm_email": "req.body.confirm_email"

}

标签: node.jsjsongoogle-cloud-functions

解决方案


问题在于if您正在检查options属性中的值,就好像它们出现在您在请求正文中发送的数据的顶层一样。

您也可以在使用没有类型强制的运算符时检查null值。!=

如果您发送的数据是您随问题提供的数据,请将您的if条件内容更改为(检查options字段内的值,删除undefined检查):

req.body.name != null && req.body.type != null && req.body.discipline != null && req.body.price_options != null
&& req.body.price != null && req.body.addon_prompt != null && req.body.addons != null && req.body.ship_price != null
&& req.body.keycode_bank != null && req.body.card_type != null && req.body.options != null && req.body.options.certificate_prompt != null
&& req.body.options.student_to_instructor_ratio != null && req.body.options.student_to_manikin_ratio != null && req.body.options.electronic_signature != null

并将创建newCourse变量的位置更改为:

let newCourse = {
    "name": req.body.name,
    "type": req.body.type, //1: Classroom session enabled 2. No Classroom session 
    "discipline": req.body.discipline,
    "price_options": req.body.price_options, //Registrations allowed with deposits or not?
    "price": req.body.price,
    "addon_prompt": req.body.addon_prompt,
    "addons": req.body.addons, //add addons api values will be sent here 
    "ship_price": req.body.ship_price,
    "keycode_bank": req.body.keycode_bank, //Keycode bank value will be sent here
    "card_type": req.body.card_type, //Card type value will be sent here
    "options": {
        "certificate_prompt": req.body.options.certificate_prompt,
        "student_to_instructor_ratio": req.body.options.student_to_instructor_ratio,
        "student_to_manikin_ratio": req.body.options.student_to_manikin_ratio,
        "electronic_signature": req.body.options.electronic_signature
    }
}

现在您可以发送示例数据:

{
    "name": "req.body.name",
    "type": "req.body.type", 
    "discipline": "req.body.discipline",
    "price_options": "req.body.price_options",
    "price": "req.body.price",
    "addon_prompt": "req.body.addon_prompt",
    "addons": "req.body.addons",
    "ship_price": "req.body.ship_price",
    "keycode_bank": "req.body.keycode_bank", 
    "card_type": "req.body.card_type", 
    "options": {
        "certificate_prompt": "req.body.certificate_prompt",
        "student_to_instructor_ratio": "req.body.student_to_instructor_ratio",
        "student_to_manikin_ratio": "req.body.student_to_manikin_ratio",
        "electronic_signature": "req.body.electronic_signature"
    },
    "ceu_credits": "req.body.ceu_credits",
    "description": "req.body.description",
    "confirm_email": "req.body.confirm_email"

}

与邮递员一起,它应该可以工作。


推荐阅读