首页 > 解决方案 > 使用 for 或 forEach 查询 json 中的每个对象

问题描述

我的问题是,我想使用一些循环对 JSON 中的每个对象进行 INSERT 查询,但我几乎总是得到一个错误“在将标头发送到客户端后无法设置标头”。有人可以帮忙吗?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 文件。

标签: javascriptmysqlnode.js

解决方案


您必须将每个包装query在 a 中Promise并等待所有完成,然后再发送responseusingPromise.all

database()当其中一个查询失败并且您将throw无法访问已解决的承诺时,情况并非如此。

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

推荐阅读