我正在为我的应用程序开发一个后端路由,它需要添加多行(从客户端接收的数组中的每一项对应一行).我的第一个 idea 是对我的数据进行for次循环,并 for each 数组项执行数据库查询,如下所示:

router.get('api/postGuests', (req, res) => {
  const arrayOfPeople = req.body;
  // arrayOfPeople looks like this for example: [{name: Jason, age: 24}, {name: Tyler, age: 34}]

  for (let i=0; i<arrayOfPeople.length; i++) {
    db.query('INSERT INTO people (name, age) VALUES (?, ?)', [arrayofPeople[i].name, arrayOfPeople[i].age])
  }
})

问题是,我不认为为每一行进行单独的查询是高效的,而且考虑到这些查询是异步的,我可以看到随着我的扩展,会出现很多问题.

有人能就如何最好地处理这种情况给我一些建议吗?谢谢!

推荐答案

不需要使用多个语句.您可以用一条INSERT语句插入多行.

只需调整您的预准备语句,并一次性传递所有值.请注意,传递给db.query的参数需要是包装在数组中的数组array.

简短的示例:

const arrayOfPeople = [
    {name: "Jason", age: 24}, 
    {name: "Tyler", age: 34},
    ...
];

db.query(
    'INSERT INTO people (name, age) VALUES ?',
    [arrayOfPeople.map(item => [item.name, item.age])]
);

Javascript相关问答推荐

使用jsPDF添加Image JPEG将p5.js草图画布下载为PDF

使用Element.children在前后移动 node

我可以在useState中调用函数并使用其数据吗

功能和普通对象之间的原型污染

JavaScript .Click()函数不起作用

如何expose 像React在onChange、onClick等中所做的那样的参数?

获取最接近的父项(即自定义元素)

设置默认值后动态更新japbox或调色板

如何在加载的元数据上使用juserc和await中获得同步负载?

如何通过在提交时工作的函数显示dom元素?

我试图实现用户验证的reduxstore 和操作中出了什么问题?

D3 Scale在v6中工作,但在v7中不工作

如何从URL获取令牌?

Prisma具有至少一个值的多对多关系

如何在不影响隐式类型的情况下将类型分配给对象?

如何在HTMX提示符中设置默认值?

删除元素属性或样式属性的首选方法

JWT Cookie安全性

顶点图使用组标签更新列之间的条宽

为什么我不能使用其同级元素调用和更新子元素?