Node.js Firestore云函数在一个字段中添加多个字段
我有一个字段名为“选项”,该字段本身包含8个不同的复选框值。我正在使用nodejs编写firestore云函数,以在存在此字段“Options”的集合中发布数据。到目前为止,这是我写的Node.js Firestore云函数在一个字段中添加多个字段,node.js,json,google-cloud-functions,Node.js,Json,Google Cloud Functions,我有一个字段名为“选项”,该字段本身包含8个不同的复选框值。我正在使用nodejs编写firestore云函数,以在存在此字段“Options”的集合中发布数据。到目前为止,这是我写的 exports.addCourse = functions.https.onRequest((req, res) => { res.set('Access-Control-Allow-Origin', 'http://localhost:4200'); res.set('Access-Con
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将其命中,但出现了一个错误“所有字段都是必需的”。我做错了什么?这是在“选项”字段中添加多个字段的正确方法吗
我通过postman发送的数据不是真实的数据,因为API中没有为属性提供特定的数据类型
资料
问题出在您的
if
条件中,您正在检查选项
属性中的值,就好像它们来自您在请求正文中发送的数据的顶层一样
您也可以在使用时检查null
值=无类型强制的代码>运算符
如果您发送的数据是随问题提供的数据,请将您的If
条件内容更改为(检查选项
字段内的值,删除未定义的检查):
并将创建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"
}
使用postman,它应该可以工作。您确实可以使用JavaScript对象(如options
)填充字段,它将保存为Firestore文档中的映射。什么是用户搜索?我猜是一个集合,但它似乎没有定义。您是否在Firebase控制台的云函数日志中看到任何错误?@RenaudTarnec是的,它是集合,在顶部定义。我刚刚在这里粘贴了云函数。我只需要知道我在代码中写的是对还是错?当我用postman和相应的值点击它时,这个代码是否正常工作?@RenaudTarnec我在postman和logs中都看到了400,在云函数日志中没有其他错误?乍一看,您的代码看起来不错。是否确实满足第一个if(req.body.name!=null&&req.body.type!=null…)的所有条件??你试过一个接一个地调试这个部分吗?如果你得到一个“所有字段都是必需的”错误,这意味着对于这个If块,条件是falsy。如果是Firebase错误(例如add()方法的错误),则会得到不同的错误。
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"
}