Отправить массив в запросе на удаление, чтобы выразить из Angular 4 - PullRequest
0 голосов
/ 02 июня 2018

Я хочу удалить сразу несколько элементов из MongoDB.Для этого в бэкэнде я хочу использовать deleteMany.Но сначала мне нужно присвоить массив идентификаторам, затем создать запрос и затем выполнить удаление

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)
    }
  });
});

Моя проблема заключается в том, что я не знаю, как передать массив идентификаторов идентификаторов в бэкэнд из внешнего интерфейса.Я попытался с requestParameters, но это не удалось ... Также я попытался RequestOptions , но теперь это устарело ... Я думаю, я должен добавить все идентификаторы в качестве параметров?Как я могу перебрать идентификаторы и добавить его в params?Или, может быть, есть другой способ лучше?

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

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

1 Ответ

0 голосов
/ 02 июня 2018

При отражении глагол DELETE, вероятно, не подходит для "списка" контента, и он лучше подходит для POST или PUT или даже PATCH.Для всех остальных глаголов общепринятым является то, что они будут иметь тело запроса, подходящее для хранения таких данных, как «список».

Как правило, в POST нет ничего плохого, а в не «официально», что DELETE не должен посылать тело контента , вам, вероятно, лучше придерживаться стандартов, по крайней мере, с точки зрения того, что было бы наиболее широко поддержано, если бы ваш «передний конец» в конечном итоге говорил сдругая «внутренняя» структура сервиса на более позднем этапе.

Поэтому, если вместо этого 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:

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)
    }
  });
});
...