javascript - 使用 for 或 forEach 查询 json 中的每个对象

标签 javascript mysql node.js

我的问题是,我想使用某个循环对 JSON 中的每个对象进行 INSERT 查询,但我几乎总是收到错误消息“将 header 发送到客户端后无法设置”。有人可以帮忙吗?Tnx

const connection = require('./config');

module.exports.excel = function (req, res) {

    var _query = 'INSERT INTO excel (id, first_name, last_name) values ?';

    var jsonData = req.body;

    var values = [];

    function database() {
        return new Promise((resolve, reject) => {
            jsonData.forEach((value) => {
                values.push([value.id, value.first_name, value.last_name]);
                connection.query(_query, [values], (error, results) => {
                    if (error) {
                        reject(
                            res.json({
                                status: false,
                                message: error.message
                            }))
                    } else {
                        resolve(
                            res.json({
                                status: true,
                                data: results,
                                message: 'Excel file successfully created in database'
                            }))
                    }
                });

            });
        })

    }
    async function write() {
        await database();
    }

    write();
}

在我从 Angular 6 前端获取 JSON 后,我将 req.body 放入 jsonData 并尝试使用 forEach 将每个对象(在本例中为“值”)放入查询并将其写入 Excel 文件。

最佳答案

您必须将每个查询 包装在Promise 中并等待所有完成,然后使用 Promise.all 发送 response

并不是说 database() 会在其中一个查询失败时throw 并且您将无法访问已解决的 promise 。

const connection = require('./config');

module.exports.excel = function(req, res) {
  const _query = 'INSERT INTO excel (id, first_name, last_name) values ?';

  const jsonData = req.body;

  function database() {
    return Promise.all(
      jsonData.map(
        value =>
          new Promise((resolve, reject) => {
            const values = [value.id, value.first_name, value.last_name]

            connection.query(_query, [values], (error, results) => {
              if (error) {
                reject(error.message);
                return;
              }
              resolve(results);
            });
          })
      )
    );
  }

  async function write() {
    try {
      const results = await database();
      res.json({
        status: true,
        data: results,
        message: 'Excel file successfully created in database'
      });
    } catch (e) {
      res.json({
        status: false,
        message: e.message
      });
    }
  }

  write();
};

关于javascript - 使用 for 或 forEach 查询 json 中的每个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57563824/

相关文章:

node.js - 如何用 Jest 设置媒体查询?

javascript - 带暂停/重置的倒数计时器

javascript - Angular 2选择具有初始值的复杂对象

mysql - 使用akka http在Mysql表中存储JSON

node.js - ExpressJS重定向方法

javascript - 使用 node-red-admin 保护 Node-Red Electron 应用程序

Javascript如何在字符串中找到字符 "utf-16"

Javascript变量范围问题

mysql - 我想要像 sum() 这样的函数在 mysql 中添加数据类型时间列中的所有行

javascript - SQL 更新使用 Datepicker.js 将日期重置为 0000-00-00