嗨,我想问一下MySQL的ExpressJS . 当使用MySQL查询出错时,全局处理错误的正确方法是什么?

示例错误:

/Users/stevanuswijaya/yummy-mummy-server/node_modules/mysql/lib/protocol/Parser.js:80 throw err; //重新抛出非MySQL错误^错误:发送后无法设置标头 . 在ServerResponse.send的ServerResponse.header(/Users/stevanuswijaya/yummy-mummy-server/node_modules/express/lib/response.js:767:10)的ServerResponse.OutgoingMessage.setHeader(_http_outgoing.js:356:11)处( /Users/stevanuswijaya/yummy-mummy-server/node_modules/express/lib/response.js:170:12)在ServerResponse.json(/Users/stevanuswijaya/yummy-mummy-server/node_modules/express/lib/response.js) :267:15)在Query._callback(/Users/stevanuswijaya/yummy-mummy-server/src/routes/foodRoutes.js:166:19)的Query.Sequence.end(/ Users / stevanuswijaya / yummy-mummy-server) /node_modules/mysql/lib/protocol/sequences/Sequence.js:88:24)在Query._handleFinalResultPacket(/Users/stevanuswijaya/yummy-mummy-server/node_modules/mysql/lib/protocol/sequences/Query.js:139) :8)在Protocol._parsePacket(/ Users / stevanuswijaya / yummy-mummy)的Query.OkPacket(/Users/stevanuswijaya/yummy-mummy-server/node_modules/mysql/lib/protocol/sequences/Query.js:72:10) -server / node_modules / mysql / lib / protocol / Protocol.js:279:23)在帕尔斯er.write(/Users/stevanuswijaya/yummy-mummy-server/node_modules/mysql/lib/protocol/Parser.js:76:12)[nodemon]应用程序崩溃 - 在开始之前等待文件更改...

这是我在foodRoutes.js的路线:

foodRouter.route("/add/food").post(function(req, res, next) {
      var food = req.body.food;
      query =
        "INSERT INTO `food`" +
        "(`food_name`," +
        "`food_category`," +
        "`food_image`," +
        "`price`," +
        "`food_kind`," +
        "`nutrition`," +
        "`calories`," +
        "`user_id`," +
        "`favorite`) " +
        " VALUES( " +
        "'" +
        food.food_name +
        "'" +
        ", " +
        food.food_category +
        ", " +
        "'" +
        food.food_image +
        "'" +
        ", " +
        food.price +
        ", " +
        "'" +
        food.food_kind +
        "'" +
        ", " +
        food.nutrition +
        ", " +
        food.calories +
        ", " +
        food.user_id +
        ", " +
        "'" +
        food.favorite +
        "'" +
        ") ";
      console.log(query);
      //console.log(queryFood);

      connection.on("error", function(err) {
        console.log(err.code);
        return next(err);
      });

      connection.beginTransaction(function(err) {
        if (err) {
          if (err) {
            return next(err);
          }
        }
        connection.query(query, function(err, rows) {
          if (err) {
            connection.rollback(function() {
              if (err) {
                return next(err);
              }
            });
          }

          connection.commit(function(err) {
            console.log("Commited");
            if (err) {
              console.log("ERROR");
              connection.rollback(function() {
                console.log("Dinext");
                if (err) {
                  return next(err);
                }
              });
            } else if (rows) {
              if (rows.affectedRows) {
                res.status(200).json({
                  status: "success",
                  message: "Inserted one food with food_name " + food.food_name,
                  food_id: rows.insertId
                });
              }
            } else {
              res.json([]);
            }
          });
        });
      });
    });

这是我的app.js:

var express = require("express");
var router = express.Router();
var app = express();
var port = 4200;
var cors = require("cors");
var bodyParser = require("body-parser");
var methodOverride = require('method-override');


// Required application specific custom router module
var userRouter = require("./src/routes/userRoutes");
var foodRouter = require("./src/routes/foodRoutes");
var placeRouter = require("./src/routes/placeRoutes");
var groupRouter = require("./src/routes/groupRoutes");
var glyphRouter = require("./src/routes/glyphRoutes");

// Use middlewares to set view engine and post json data to the server

//Error Handler
var clientErrorHandler = function (err, req, res, next) {
  if (req.xhr) {
    console.log(err);
    res.status(500).send({ error: 'Something failed!' })
  } else {
    next(err)
  }
};

var errorHandler = function (err, req, res, next) {
  console.log(err);
  if (res.headersSent) {
    return next(err)
  }
  res.status(500)
  res.render('error', { error: err })
}

var logErrors = function  (err, req, res, next) {
  console.error(err.stack)
  next(err)
}

app.use(express.static("public"));
app.use(cors());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(methodOverride())
app.use(bodyParser.json());
app.use(logErrors);
app.use(clientErrorHandler);
app.use(errorHandler);

app.use("/users", userRouter);
app.use("/foods", foodRouter);
app.use("/places", placeRouter);
app.use("/groups", groupRouter);
app.use("/glyphs", glyphRouter);


// Start the server
app.listen(port, function() {
  console.log("Server is running on Port: ", port);
});

app.get("/", function(req, res) {
  res.send("Hello express");
});

module.exports = router;

我想在mysql / query中出现错误时,会记录查询和错误,并且节点服务器不会崩溃 . 现在使用当前代码,当查询中出现错误时,服务器将崩溃 . 我尝试在路由中使用错误处理程序和下一个方法,但错误仍然发生 . 我也尝试将路由参数更改为(err,req,res和next),但该方法不起作用 . 我不想只处理错误只来自我的前端验证(使用react) . 我也希望从我的服务器端处理错误 . 请帮忙 . 谢谢...