嗨,我想问一下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) . 我也希望从我的服务器端处理错误 . 请帮忙 . 谢谢...