Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 发送删除请求中的数组以从角度4表示_Javascript_Node.js_Angular_Express_Mongoose - Fatal编程技术网

Javascript 发送删除请求中的数组以从角度4表示

Javascript 发送删除请求中的数组以从角度4表示,javascript,node.js,angular,express,mongoose,Javascript,Node.js,Angular,Express,Mongoose,我想从MongoDB中一次删除几个元素。为此,我想在后端使用deleteMany。但首先我需要将数组分配给ID,然后构建查询,然后执行删除 app.delete('/tasks', function(req,res){ ids = []; var myquery = { _id: { $in: ids } }; Model.collection.deleteMany(myquery, function(err, result) { if (err) throw err;

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

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添加为params?如何迭代槽ID并将其添加到参数?或许还有其他更好的方法

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

    return this.http.delete( this.api, requestOptions);
  }
反思一下,DELETE动词可能不适用于内容列表,而这更适合于POST、PUT甚至补丁。对于所有其他动词,人们普遍认为这些动词都有一个请求体,该请求体适合保存列表等数据

一般来说,POST没有什么问题,虽然它是,但您可能最好还是坚持标准,至少从最广泛支持的角度来看,如果您的前端在稍后的某个阶段与不同的后端服务结构对话,您的标准将得到最广泛的支持

因此,如果我们改为发布,则将是:

deleteData(ids) {
  // presuming this.api points to /tasks at the correct point
  return this.http.post( this.api, { ids });
}
在快车方面,如果您尚未:

const bodyParser = require('body-parser');
app.use(bodyParser.json());
然后在实际的路由控制器中,只需从req.body返回数组,并为POST请求指定一个特定的路由:

还需要注意的是,mongoose直接支持模型,因此无需使用底层驱动程序集合对象的集合访问器。使用mongoose方法还可以确保,如果id列表实际上是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)
    }
  });
});

您需要将id设置为请求正文中的一个值。然后,您的express后端需要从req.body读取此数据。假设您已经设置了bodyParser中间件,这应该很简单。如果你还没有设置,那么请在你的问题中这样说。我还想问一下,您为什么打电话给Model.collection.deleteMany而不是Model.deleteMany。您是否有真正的原因,或者这只是您从其他地方复制的代码?请参阅提供的答案中是否有您认为无法解决您的问题的内容?如果是,请对答案进行评论,以澄清哪些问题需要解决,哪些问题尚未解决。如果它确实回答了您提出的问题,那么请注意您提出的问题
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)
    }
  });
});