遍历请求主体节点js + express

时间:2020-09-16 22:26:34

标签: javascript node.js loops express

我正在发送带有数据作为对象数组的请求:

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

im使用JSON.stringify(),而我的要求正文如下所示: { '{"id":"1"},{"id":"2"},{"id":"3"}': '' }

现在,我想遍历req.body并获取所有ID,以便可以从SQL DB中删除它们。 我正在使用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: 
        }
    })
}

帖子请求(客户):

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

2 个答案:

答案 0 :(得分:2)

编辑

通过发送ID数组和ID并直接在服务器中使用它,我们所做的一切甚至更加容易。

客户:

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.parseExpress's body-parser

第二,您可能在数据库库中有一种方法可以发送多个ID进行销毁。

例如,如果您使用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 :(得分:0)

正如另一个用户所说,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.}