цикл через узел тела запроса js express

#javascript #node.js #loops #express

#javascript #node.js #циклы #экспресс

Вопрос:

Я отправляю запрос с данными в виде массива объектов:

  [
  {id: "1"},
  {id: "2"},
  {id: "3"}
 ]
  

я использую JSON.stringify() , и мой req.body выглядит так:
{ '{"id":"1"},{"id":"2"},{"id":"3"}': '' }

Теперь я хочу выполнить цикл через req.body и получить все идентификаторы, чтобы я мог удалить их из базы данных SQL. Я использую Sequelize. Серверная часть:

 exports.deleteIds = (req, res, next) => {
    console.log(req.body)
//here should be loop so i can delete all the ids one by one.
    Model.destroy({
        where: {
            id: 
        }
    })
}
  

Запрос post (клиент):

 let ids = []
//maybe here is the problem?
for (var i = 0; i < selectedRow.length; i  ) {
   ids.push({id:selectedData[i].id})          
}

let Url = "/admin/deleteIds"
let data = JSON.stringify(ids)

event.preventDefault();

$.post(Url, data, function (data, status) {

  }).done(function (res) {
     if (res.ids.length == 0) {
        $('#mainContent').html('<h1>0 users found</h1>')
     }
  })
  .fail(function (err) {
    console.log(err.responseJSON.message)
  })
  

Комментарии:

1. какую библиотеку БД вы используете?, это может быть встроенный ИТ-вариант

2. @Itamar я использую Sequelize

3. смотрите мой ответ ниже

Ответ №1:

Редактировать

Мы делаем все еще проще, отправляя массив идентификаторов и используя его непосредственно на сервере.

Клиент:

 let ids = []
for (var i = 0; i < selectedRow.length; i  ) {
   ids.push(selectedData[i].id)  // <-- this is the change         
}

let Url = "/admin/deleteIds"
let data = {items: ids}
//...
  

Сервер:

 exports.deleteIds = (req, res, next) => {
   const ids = req.body.items; // <-- no mapping needed
   Model.destroy({
      where: {id: ids}
   })
}
  

Тело POST-вызова должно быть допустимым JSON, что означает, что это должен быть объект js.

Предполагая, что вы используете выборку

Отправка данных на сервер с помощью Fetch API

  const rawResponse = await fetch('https://httpbin.org/post', {
    method: 'POST',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({items:  [ {id: "1"}, {id: "2"}, {id: "3"} ]})
  });
  

Во-первых, если вы получаете req.body как объект, нет причин использовать JSON.stringify . если нет, используйте анализатор тела JSON.parse или Express

Во-вторых, у вас, вероятно, есть способ в библиотеке DB отправить несколько идентификаторов для уничтожения.

Если вы используете Sequelize.js например:

 exports.deleteIds = (req, res, next) => {
   const ids = req.body.items.map(({id}) => id); 
   Model.destroy({
      where: {id: ids}
   })
}
  

В случае, если эта опция не существует, позволяет выполнить цикл:

 exports.deleteIds = (req, res, next) => {
   req.body.items.forEach(({id}) => {
      Model.destroy({
        where: {id}
      })
  }) 
}
  

Ваш фиксированный вызов POST:

 let ids = []
for (var i = 0; i < selectedRow.length; i  ) {
   ids.push({id:selectedData[i].id})          
}

let Url = "/admin/deleteIds"
let data = {items: ids} // <-- this is the change

event.preventDefault();

$.post(Url, data, function (data, status) {

  }).done(function (res) {
     if (res.ids.length == 0) {
        $('#mainContent').html('<h1>0 users found</h1>')
     }
  })
  .fail(function (err) {
    console.log(err.responseJSON.message)
  })
  

Комментарии:

1. Я уже использую анализатор тела в качестве промежуточного программного обеспечения. когда я пытаюсь отправить запрос post с массивом объектов без JSON.stringify [ {id: "1"}, {id: "2"}, {id: "3"}] , я получаю { undefined: [ '', '', '' ] } (когда консоль. log req.body)

2. можете ли вы добавить к вопросу почтовый вызов клиента и обработчик почтового сервера?

3. Спасибо, я попробую это, поэтому просто чтобы убедиться, что я могу изменить свой код в этой строке, чтобы у меня был тот же код, что и у вас, для получения действительных данных json let data = JSON.stringify({items: ids})

4. Я сделал решение сверху. но я изменил одну вещь, и она работает идеально. я отправляю данные без JSON.stringify: {items: [ {id: "1"}, {id: "2"}, {id: "3"} ]} и его работы

5. отредактируйте свой ответ и удалите JSON.stringify из решения. я решил сделать это с const ids = req.body.items.map(({id}) => id); , и он работает хорошо, спасибо.

Ответ №2:

Как упоминает другой пользователь, req.body всегда должен быть допустимым json, поэтому получение массива маловероятно.

Когда вы получаете действительный запрос json, в Sequelize вы можете использовать три метода:

  1. get() Функция, которая определяет, что вы извлекаете из базы данных:https://sequelize.org/master/manual/getters-setters-virtuals.html

  2. set() Метод в модели, который запускает функцию для того, что вы хотите сохранить в базе данных:

 const User = sequelize.define('user', {
  username: DataTypes.STRING,
  password: {
    type: DataTypes.STRING,
    set(value) {
      this.setDataValue('password', hash(value));
    }
  }
});

  
  1. (Вероятно, моя рекомендация здесь) Функция непосредственно на контроллере, как в этом примере, где я указываю название организации:
   try {
    const result = await Organization.create({
      name: req.body.name,
      type: req.body.type,
      slug: slugify(req.body.name, { lower: true, remove: /[* ~.()'"!:@]/g, strict: true }),
      fields: allowedFields
    }) catch(err) { etc.}
  

Комментарии:

1. Ключи объекта не будут работать, поскольку это был массив в вопросе

2. Извините, Итамар, я пропустил это. Будет обновляться. Предлагаемая мной функция create — это всего лишь пример того, как использовать возможность функции встроенного контроллера модели в Sequelize