【问题标题】:Insert in bulk using Sequelize with Node and Express使用 Sequelize with Node 和 Express 批量插入
【发布时间】:2018-05-16 21:08:35
【问题描述】:

寻找一种使用 Sequelize Model.bulkCreate 将活动批量插入数据库的方法。

不确定如何将活动从视图带到路由功能,以便使用bulkCreate 插入它们。现在我只插入一个活动。

查看:

<form action="/create" method="POST">
  <div class="form-group">
    <label>Plan Name</label>
    <input type="text" name="plan_name" placeholder="Plan Name">
  </div>
  <div class="form-group">
    <label>Description</label>
    <input type="text" name="description" placeholder="Description">
  </div>
  <div class="form-group">
    <label>Activity</label>
    <input type="text" name="activity_name" placeholder="Activity">
    <label>Comment</label>
    <input type="text" name="comment" placeholder="Comment">
    <input type="button" id="add" class="btn btn-success" value="Add">
  </div>
  <div class="form-group" id="new">
  </div>
    <input type="hidden" name="_csrf" value="{{csrfToken}}">
    <input type="submit" class="btn btn-success" value="Submit">
</form>
<script type="text/javascript">
  $('#add').click(function() {
    let activity = $('<div class="form-group"><label>Activity</label><input type="text" name="activity_name" placeholder="Activity"><label>Comment</label><input type="text" name="comment" placeholder="Comment"></div>');
    $('#new').append(activity);
  });
</script>

路线:

  app.post('/create', (req, res) => {
    const user_id = req.user.id;
    const data = {
      plan_name: req.body.plan_name,
      description: req.body.description,
      userId: user_id
    };
    PlanModel.Plan.create(data).then(plan => {
      const activity = {
        activity_name: req.body.activity_name,
        comment: req.body.comment,
        plans_id: plan.id
      };
      ActivityModel.Activity.create(activity);
      res.redirect('/');
    });
  });

【问题讨论】:

    标签: node.js express sequelize.js


    【解决方案1】:

    1) 使字段具有像数组一样的名称

    <div class="activities">
    
      <div class="form-group">
        <label>Activity</label>
        <input type="text" name="activities[0][name]" placeholder="Activity">
        <label>Comment</label>
        <input type="text" name="activities[0][comment]" placeholder="Comment">
      </div>
    
      <div class="form-group">
        <label>Activity</label>
        <input type="text" name="activities[1][name]" placeholder="Activity">
        <label>Comment</label>
        <input type="text" name="activities[1][comment]" placeholder="Comment">
      </div>
    
    </div>
    
    <div class="form-group>
      <input type="button" id="add" class="btn btn-success" value="Add">
    </div>
    

    2) 在服务器端只需获取 req.body.activities 并生成对象数组并调用 bulkCreate

    app.post('/create', async (req, res) => {
      try {
        const data = {
          plan_name: req.body.plan_name,
          description: req.body.description,
          userId: req.user.id
        };
        const plan = await PlanModel.Plan.create(data);
    
    
        if (req.body.activities && Array.isArray(req.body.activities)) {
          const activities = req.body.activities.map(
            activity => {
              return {
                activity_name: activity.name,
                comment: activity.comment,
                plans_id: plan.id
              }
            });
          await ActivityModel.Activity.bulkCreate(activities);
        }
    
        res.redirect('/');
      }
      catch(error) {
        res.status(500).send(error);
      }
    });
    

    3) 由于 urlencoded 模式的正文解析器具有扩展选项,可以深入解析所有字段。您必须启用它。
    确保 bodyParser 中间件附加extended: true:

     const bodyParser = require('body-parser');
     app.use(bodyParser.urlencoded({extended: true}));
    

    【讨论】:

    • 代码只运行到const plan = await PlanModel.Plan.create(data);。只有计划被插入,插入活动的代码不会运行。不过没有错误。
    • @Supreme_B 做:console.log(req.body) 并查看日志
    • 在控制台日志中使用 cmets 获取所有数据、计划和活动。
    • @Supreme_B 请将该日志添加到某处并与我分享
    猜你喜欢
    • 2015-03-31
    • 1970-01-01
    • 2015-06-10
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 2019-07-15
    • 2018-08-18
    相关资源
    最近更新 更多