【问题标题】:Error: Reference.set failed: First argument contains undefined in property错误:Reference.set 失败:第一个参数在属性中包含未定义
【发布时间】:2019-10-09 15:10:33
【问题描述】:

我正在尝试在 Nodejs/express 应用程序中测试 POST 方法。我已连接到 firebase 数据库。 我的问题主要与错误有关。我做错了什么,请问我该如何解决?

这是错误报告:

PS C:\Users\WorkoutApp_v1> 节点 app.js
服务器在端口启动:3000

错误:Reference.set 失败:第一个参数在属性“workouts.-Lqkqtcf6e2RED2F_1av.name”中包含未定义

这是带有 POST 方法的锻炼.js 文件。

const express = require('express');
const router = express.Router();
const firebase = require('firebase');


router.get('/add', function(req,res,next) {
    res.render('workouts/add');
});

router.post('/add', function(req,res,next) {
     var workout = {
       name: req.body.name,
       discription: req.body.discription,
       set: req.body.set,
       repsTime: req.body.repsTime
     }
    // console.log(workout);
    // return;

    // const fbRef = firebase.database().ref();
    // var dbRef = fbRef.child('workouts');
    // dbRef.push().set(workout);


    // alternative implementation of the above 3-lines
    firebase.database().ref().child('workouts').push().set(workout);

    req.flash('success_msg', 'Workout saved');
    res.redirect('/workouts');
});

module.exports = router;

这是 add.ejs 文件。

   <form method="post" action="/workouts/add">
  <div class="form-group">
    <label>Exercise</label>
    <input type="text" class="form-control" name="name" placeholder="Workout Name">
    <label>Description</label>
    <input type="text" class="form-control" name="description" placeholder="Description">
    <label>Set</label>
    <input type="text" class="form-control" name="sets" placeholder="Number of sets">
    <label>RepsTime</label>
    <input type="text" class="form-control" name="repsTime" placeholder="Number of repsTime">
  </div>
  <button type="submit" class="btn btn-default">Submit</button>
   <a class="btn btn-danger" href="/workouts">Close</a>
</form>

【问题讨论】:

  • 对于节点应用程序,我建议使用 Firebase Admin SDK 而不是客户端库可能会更好。 firebase.google.com/docs/projects/…
  • @DougStevenson 谢谢,但这将如何帮助我解决我遇到的错误?

标签: node.js firebase firebase-realtime-database


【解决方案1】:

值undefined不能写入RTDB。

undefined 的值是您访问不存在的对象属性时获得的值。

您的req.body.name 是undefined,因为req.body 没有name 属性。

你注释掉的console.log(workout)打印了什么?

当您编写可能导致在 RTDB 中写入 undefined 的代码时,您应该将其替换为其他内容。在这种情况下,您可以使用req.body.name || '',将缺少的name 属性替换为空字符串。

一般来说,使用|| 会引起麻烦,因为0 和'' 等值与false 等价,因此它们将被替换为您的默认值。

更安全的做法是value === undefined ? defaultValue : value。

【讨论】:

  • @Stratusbas 控制台打印最后一个字段 - numberOfReps 字段。 { name: 'test' },用于测试。我期望得到表格的结果。
  • @user10728848 这很奇怪。其他属性也应该有一些值。也许您的输出以某种方式格式化并且您只看到最后一行?请改用console.log(JSON.stringify(workout))。
  • 仍然没有任何改变。
  • @user10728848 我会分别尝试console.logging 每个req.body 属性。问题与 RTDB 无关,而是缺少属性。除此之外,请注意您的拼写。你有req.body.set,它在html中是sets,在req.body.discription,它在html中是description。最后,您无需先等待set 成功就显示成功消息并进行重定向。您可以将函数声明为async 并在set 调用上使用await,或者在其上使用then 和catch。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 2018-04-26
  • 1970-01-01
相关资源
最近更新 更多