Javascript 发送删除请求中的数组以从角度4表示
我想从MongoDB中一次删除几个元素。为此,我想在后端使用deleteMany。但首先我需要将数组分配给ID,然后构建查询,然后执行删除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;
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)
}
});
});