控制器中未收到用户 ID - Node-js

问题描述 投票:0回答:1

我正在学习 Node,但遇到了一些问题。 我的目标是创建一个表,列出在数据库中注册的用户,该表创建正常,但在编辑部分,用户 ID 未正确传递。 然后就加载了编辑页面,但是没有加载要编辑的用户数据。

我正在使用:

"dependencies": {
    "express": "^4.18.2",
    "express-handlebars": "^7.1.2",
    "mysql2": "^3.6.1",
    "nodemon": "^3.0.1",
    "sequelize": "^6.33.0"
  }

表格是通过 Partials 加载的:

<table class="table table-striped table-sm">
  <thead>
    <tr>
      <th>Id</th>
      <th>Usuário</th>
      <th>Idade</th>
      <th class="text-right p-2">Ações</th>
    </tr>
  </thead>
  <tbody>
    {{#each users}}
    <tr>
      <td>{{this.id}}</td>
      <td>{{this.name}}</td>
      <td>{{this.age}}</td>
      <td class="text-right p-2">
        <a href="/editUser/{{this.id}}" class="btn btn-primary btn-sm">Editar</a>
        <a href="/deleteUser/{{this.id}}" class="btn btn-danger btn-sm">Excluir</a>
      </td>
    {{/each}}
  </tbody>
</table>

路线

router.get('/editUser/:id', UserController.editUser);

控制器:

static async editUser(req, res) {
    const id = req.body.id;
    console.log("ID: ",id);
    const user = await User.findOne({where:  {id: id }, raw: true});
    res.render('editUser', { user });
  }

编辑页面:

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
{{> navbar}}
<div class="container d-flex align-items-center justify-content-center flex-column ">
  <h1>Editar o usuário {{user.name}}</h1>
  <form action="/editUser/{{user.id}}" method="post" class="d-flex align-items-center justify-content-center flex-column p-2 m-2 ">
  <input type="hidden" name="id" value="{{user.id}}">
    <div class="form-group d-flex flex-column ">
      <label for="name" class="">Nome</label>
      <input type="text" name="name" id="name" class="form-control" value="{{user.name}}" required>
    </div>
    <div class="form-group d-flex flex-column">
      <label for="age">Idade</label>
      <input type="number" name="age" id="age" class="form-control" value="{{user.age}}">
    </div>
    <input type="submit" value="Editar" class="btn btn-primary btn-success m-2">
    <input href="/allUsers" type="button" value="Cancelar" class="btn btn-primary btn-danger m-2">
  </form>
</div>

完整项目位于:https://github.com/alanmarinho/node_addEdit_User

有人可以帮助我吗?

我希望用户数据显示在编辑用户屏幕上

mysql handlebars.js express-router
1个回答
0
投票

正如用户@76484所指出的,this答案解释了为什么您的数据可能无法显示。尽管这是关于 Mongoose 的,但它仍然与 Sequelize 相关 因为:

默认情况下,所有查找器方法的结果都是模型类的实例(而不是简单的 JavaScript 对象)。这意味着数据库返回结果后,Sequelize 会自动将所有内容包装在适当的实例对象中。

您必须在

{ raw: true }
查询中传递
find
选项,以便数据作为 POJO 返回,而不是 Sequelize 模型类的实例。你已经正确识别了这一点,因为我可以看到你有那一套。然而,你会为此自责,因为你需要在这里使用
req.params.id
而不是
req.body.id

static async editUser(req, res) {
    //const id = req.body.id; //< Delete this
    const id = req.params.id //< Add this
    console.log("ID: ",id);
    const user = await User.findOne({where:  {id: id }, raw: true});
    res.render('editUser', { user });
  }

这是因为您将

id
作为
url
中的查询参数发送,而不是在表单中发布。

© www.soinside.com 2019 - 2024. All rights reserved.