【问题标题】:Express post request saving as undefined in DB快速发布请求在数据库中保存为未定义
【发布时间】:2019-06-19 20:28:31
【问题描述】:

我正在学习如何设置 Express 服务器,但在创建新用户时遇到了一个奇怪的问题。 POST 请求通过并且没有给出错误并将我带到我的仪表板,但是当我查看 sqlite DB 时,它显示注册表中保存为未定义的所有值。我相信我已经安装了 body-parser 并将其正确调用到服务器中。

我尝试更改 extended: true 而不是 false 并添加 res.setHeader('Content-Type', 'text/plain') 到 app.use 中,如 body-parser guide 所述,但仍保存为未定义每次。

这是我的 server.js 代码

const app = express();
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  res.setHeader('Content-Type', 'text/plain');
  next();
});

这是 server.js 中的 POST 代码

app.post('/register', function(req, res) {
  bcrypt.hash(req.body.password, saltRounds, function(err, hash) {
    let db = new sqlite3.Database("./database/InvoiceApp.db");
    let sql = `INSERT INTO users(name, email, company_name, password) VALUES ('${req.body.name}','${req.body.email}','${req.body.company_name}','${hash}')`;
    db.run(sql, function(err) {
      if (err) {
        throw err;
      } else {
        return res.json({
          status: true,
          message: "User Created"
        });
      }
    });
    db.close()
  });
});

这是我的表单代码,我正在使用 vue.js

register () {
      const formData = new FormData()
      let valid = this.validate()
      if (valid) {
        formData.append('name', this.model.name)
        formData.append('email', this.model.email)
        formData.append('company_name', this.model.company_name)
        formData.append('password', this.model.password)

        this.loading = "Registering you, please wait"

        axios.post('http://localhost:3128/register', formData).then(res => {
          this.loading = ''
          if (res.data.status === true) {
            this.$router.push ({
              name: 'dashboard',
              params: { user: res.data.user }
            })
          } else {
            this.status = res.data.message
          }
        })
      } else {
        alert('Passwords do not match')
      }
    }

创建新用户时,我不会收到任何错误消息,只有当我尝试以创建的用户身份登录或执行与创建的用户相关的其他操作时。为什么我的表单在 sqlite DB 中保存为未定义?

【问题讨论】:

  • 确保在每一层都接收到数据。尝试执行 console.log(formData); 并确保在表单代码中的 axios.post() 函数之前一切正常。然后,如果它很好,请检查它是否在服务器中正确接收console.log(req);

标签: javascript node.js sqlite express body-parser


【解决方案1】:

您应该在 Vue 应用程序中使用 JSON 格式,而不是 FormData。 FormData 是一个以 Content-Type application/x-www-form-urlencoded 传递的对象。 你的身体解析器是为 Json 配置的。 请尝试更换

        formData.append('name', this.model.name)
        formData.append('email', this.model.email)
        formData.append('company_name', this.model.company_name)
        formData.append('password', this.model.password)

使用实际的 JS 对象 { “名称”:this.model.name .....其他领域...... }

并用 JSON.strinfigy(obj) 传递这个对象或这个对象stringified

【讨论】:

  • 感谢@AndryShutka 提供的信息,花了一天时间学习FormData 和JSON,您以JSON 格式发送数据是正确的。它甚至比添加 JS 对象和使用 JSON.stringify() 更容易。
【解决方案2】:

在花了一天的时间研究 FormData 和 JSON 之后,感谢 this post 和 M U 的回答,我弄明白了。因为我使用的是 Vue.js,并且使用 v-model 存储了表单中的所有内容,我所要做的就是将 post 方法更新为:

register () {
      let valid = this.validate()
      if (valid) {
        this.loading = "Registering you, please wait"

        axios.post('http://localhost:3128/register', this.model).then(res => {
          this.loading = ''
          if (res.data.status === true) {
            this.$router.push ({
              name: 'dashboard',
              params: { user: res.data.user }
            })
          } else {
            this.status = res.data.message
          }
        })
      } else {
        alert('Passwords do not match')
      }
    }

并将整个表单上传到数据库并使用哈希密码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 2020-05-02
    相关资源
    最近更新 更多