【问题标题】:Deleting orders works, deleting coffees doesn't. Identical functions删除订单有效,删除咖啡无效。相同的功能
【发布时间】:2019-09-26 19:06:13
【问题描述】:

我必须在 nodejs+express+mongodb 中构建一个 CRUD,并且我有一个删除订单的功能,它通过一个参数成功删除订单,并且该功能的副本适用于“咖啡”MongoDB 集合。

第二个返回 undefined,或者只是 {}。

首先我修改了集合,然后修改了不同的来源作为参数。

这里是 server.js

// 此代码有效。

app.delete('/orders/:coffee_id', (req, res) => {
 db.collection('orders').findOneAndDelete({name: req.body.coffee_id}, (err, result) => {
    if (err) return res.send(500, err)
    res.json('Order deleted')
  })
})

// 订单集合。这意味着访问 localhost:3000/orders/Delta 会返回 Order deleted

// 代码没有按预期工作:

app.delete('/coffees/:id', (req, res) => {
db.collection('coffees').findOneAndDelete({'name': req.body.name}, (err, result) => {
    console.log(res.body)  // returns undefined.
    if (err) return res.send(500, err)
    res.json(req.body)
  })
})

咖啡收藏。无法从此表中删除。 Postman DELETE 到 localhost:3000/coffees/Jamaica 返回 {} 并且 console.log(res.body) 返回 undefined

有人看出什么不对了吗?如果您需要更多代码,请告诉我。

提前致谢。

【问题讨论】:

  • 一般删除请求没有正文。为什么不使用路由中声明的路径参数? (例如findOneAndDelete({_id: req.params.id}, ...
  • @JakeHolzinger 我不知道,但这是个好问题。我尝试使用您的代码,结果仍然“未定义”。我附上了邮递员截图
  • 为什么要定义res.body?你可能想使用result,响应也不应该是req.body,这就是为什么响应是一个空对象。
  • @JakeHolzinger 有道理,{ lastErrorObject: { n: 0 }, value: null, ok: 1 }。

标签: node.js mongodb express ejs


【解决方案1】:

这里有几点需要注意。

1) 您的路由配置了路径参数,但您尝试引用来自req.body 的属性。我不确定这在第一条路线上是如何工作的,但我希望它不应该。您应该使用req.params 来访问路径参数。

app.delete('/orders/:coffee_id', (req, res) => {
 db.collection('orders').findOneAndDelete({name: req.params.coffee_id}, (err, result) => {
    ...
  })
})

2) 在第二条路由中,您声明了一个路径参数id,但您正试图访问一个名为name 的属性。这是实现与“工作”路线不同的地方。如果您想使用文档的ObjectId 执行删除操作,或者您是否计划使用文档的name,表面上并不清楚。

使用ObjectId

app.delete('/coffees/:id', (req, res) => {
  db.collection('coffees').findOneAndDelete({_id: req.params.id}, (err, result) => {
    ...
  })
})

使用name

app.delete('/coffees/:name', (req, res) => {
  db.collection('coffees').findOneAndDelete({name: req.params.name}, (err, result) => {
    ...
  })
})

这里的要点是您必须使用与路径参数中声明的值相同的值来引用路径参数。

/coffees/:id => req.params.id(不是req.params.name

【讨论】:

    【解决方案2】:

    显然我必须像这样定义一个 ObjectId

    var ObjectId = require('mongodb').ObjectID; //Include ObjectId 
    

    //那么

    app.delete('/coffees/:id', (req, res) => {
         db.collection('coffees').findOneAndDelete({'_id': ObjectId(req.params.id)}, (err, result) => {
            console.log(result)
            if (err) return res.send(500, err)
            res.json(result.body)
          })
        })
    

    【讨论】:

      猜你喜欢
      • 2018-07-03
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      相关资源
      最近更新 更多