【问题标题】:Send Array In Delete Reqest to Express from Angular 4从Angular 4发送删除请求中的数组到Express
【发布时间】:2018-11-12 06:00:04
【问题描述】:

我想一次从 MongoDB 中删除几个元素。为此,我想在后端使用 deleteMany。但首先我需要将数组分配给 ids,然后构建一个查询,然后执行删除

app.delete('/tasks', function(req,res){
  ids = [];
  var myquery = { _id: { $in: ids } };
  Model.collection.deleteMany(myquery, function(err, result) {
    if (err) throw err;
    if (result) {
      res.json(result)
    }
  });
});

我的问题是我不知道如何将 ID 的 ids 数组从前端传递到后端。我尝试使用 requestParameters,但失败了...我也尝试了 RequestOptions,但它现在已被贬值...我想,我应该将所有 ID 添加为参数?我如何迭代槽 id 并将其添加到参数中?或者也许还有其他更好的方法?

 deleteData(ids) {
//ids is array of IDs, which I would like to pass as requestOptions

    return this.http.delete( this.api, requestOptions);
  }

【问题讨论】:

  • 您需要将ids(可能已经是一个列表)设置为请求正文中的值。那么你的快递后端需要从req.body读取这些数据。假设您已经设置了 bodyParser 中间件,这应该很简单。如果您尚未设置,请在您的问题中说明。请问你为什么用Model.collection.deleteMany()而不是Model.deleteMany()打电话。您有真正的原因吗,或者这只是您从其他地方复制的一些代码?
  • 您认为提供的答案中是否有某些内容无法解决您的问题?如果是这样,那么请对答案发表评论,以澄清究竟需要解决哪些尚未解决的问题。如果它确实回答了您提出的问题,请注意Accept your Answers您提出的问题

标签: javascript node.js angular express mongoose


【解决方案1】:

经过反思,DELETE 动词可能不适合内容“列表”,而这更适合POSTPUT 甚至PATCH。对于所有其他动词,人们普遍认为它们将具有适合保存“列表”等数据的请求正文。

通常POST 没有任何问题,虽然它是not "official" that DELETE should not send a content body,但您最好还是坚持标准,至少从您的“前端”最终与之交谈的最广泛支持的角度来看稍后阶段的不同“后端”服务结构。

因此,如果我们改为POST,那么your angular method 将是:

deleteData(ids) {
  // presuming this.api points to /tasks at the correct point
  return this.http.post( this.api, { ids });
}

在快递方面,如果您还没有设置body-parser middleware

const bodyParser = require('body-parser');
app.use(bodyParser.json());

然后在您的实际路由控制器中,只需从 req.body 返回数组,并为 POST 请求指定一个特定命名的路由:

app.post('/tasks/delete', function(req,res) {
  var myquery = { _id: { $in: req.body.ids } };
  Model.deleteMany(myquery, function(err, result) {
    if (err) throw err;
    if (result) {
      res.json(result)
    }
  });
});

还要注意 mongoose 直接在模型上支持 deleteMany(),因此无需对底层驱动程序 Collection 对象使用 collection 访问器。还使用 mongoose 方法确保如果您的 ids 列表实际上是 ObjectId 值(因为它们通常用于 _id ),那么它们将从客户端发送的字符串中“自动转换” .实际上,无论查询中字段的模式类型是什么,mongoose 在使用它自己的方法时都会处理这个问题。

使用DELETE 确实应该为“url 内”的单参数请求保留,例如:

app.delete('/tasks/:id', function(req,res) {
  var myquery = { _id: req.params.id };
  Model.deleteOne(myquery, function(err, result) {
    if (err) throw err;
    if (result) {
      res.json(result)
    }
  });
});

【讨论】:

    猜你喜欢
    • 2018-02-20
    • 2019-09-14
    • 2018-12-22
    • 2012-01-09
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    相关资源
    最近更新 更多