【问题标题】:Mongodb and Express deleting an item from _idMongodb 和 Express 从 _id 中删除一个项目
【发布时间】:2018-07-27 11:39:54
【问题描述】:

我是 Express 和数据库的新手。我正在尝试通过遵循几个使用 Mongo DB(不是 Mongoose)、Express、Node 和 Handlebars 的教程来创建一个简单的 CRUD 待办事项列表。

我可以从输入表单创建项目并将它们成功保存到 Mongo 数据库和页面。我不知道如何根据页面和数据库中的按钮单击来删除每个项目。理想情况下,我想根据 Mongo 创建的 _id 来定位它们。

我认为问题可能与我尝试选择每个项目的方式有关。任何建议或更简单的方法来实现这一点都会很棒!

这是我的 Express 代码:

// Connecting Mongo DB
MongoClient.connect(url, (err, client) => {
  if (err) return console.log(err)
  db = client.db('todoitems')
})

 // Save items to DB from form
app.post('/items', (req, res) => {
  db.collection('items').save(req.body, (err, result) => {
    if (err) return console.log(err)
    console.log(req.body, {_id: req.body._id})
    res.redirect('/')
  })
})

// Delete item on click from DB
app.delete('/items/:id', (req, res) => {
  db.collection('items').remove({_id: req.body.id}, (err, result) => {
    if (err) return console.log(err)
    console.log(req.body)
    res.redirect('/')
  })
})

// Get items from DB to page
app.get('/', (req, res) => {
  db.collection('items').find().toArray((err, result) => {
    if (err) return console.log(err)
    res.render('index', {
      layout: false,
      items: result
    });
  })
})

这是我在 Handlebars 文件中的代码:

  <form action="/items" method="POST">
    <input type="text" placeholder="item" name="item">
    <input type="hidden" id="date" name="date" value="CurrentDate">
  </form>

  <ul>
    {{#each items}}
      <li>
        <span>{{item}} |</span>
        <span>{{date}}</span>
        <button id={{_id}}>x</button>
      </li>
    {{/each}}
  </ul>

【问题讨论】:

    标签: node.js mongodb express handlebars.js crud


    【解决方案1】:

    如果您通过_id 删除,则需要传递ObjectID(id) 而不是“字符串”id,类似于:

    remove({_id: mongodb.ObjectID( req.params.id)} ...
    

    所以,你的代码应该是这样的:

    app.delete('/items/:id', (req, res) => {
      db.collection('items').remove({_id: mongodb.ObjectID( req.params.id)}, (err, result) => {
        if (err) return console.log(err)
        console.log(req.body)
        res.redirect('/')
      })
    })
    

    【讨论】:

    • 好的,使用 ObjectID 是有意义的,但我仍然不确定如何从 Mongo 中删除点击记录。我是否需要收听某个事件,还是应该将 Handlebars 中的 id={{_id}} 附加到整个记录上?我不知道它们是如何连接的。
    • 要添加上面的答案,而不是 DELETE 请求方法,将其转换为 GET 并使用链接而不是按钮来触发该请求,即而不是 app.delete('/items/:id', (req, res) =&gt; {app.get('/items/delete/:id', (req, res) =&gt; { ... } 并将 &lt;button id={{_id}}&gt;x&lt;/button&gt; 替换为 &lt;a href="/items/delete/{{_id}}"&gt;x&lt;/a&gt;
    • 您应该尝试将您的问题拆分成更小的部分,使用curl 尝试我的解决方案,在您的情况下,对于删除,您需要类似:curl -X DELETE "http://localhost:3000/items/id"。删除工作后,关注 Handlebars 问题
    • 感谢这两个想法。我要把它拆成碎片,然后试着让它工作。
    猜你喜欢
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多