我的Node JS网络应用程序的行为非常不稳定。对于某些路由,页面一次加载正常-但任何尝试单击应用程序中其他位置的链接或刷新页面的尝试均不起作用。浏览器将变成白色,并且加载程序永远旋转。某些页面更不稳定-可以正常工作,但是在第15页加载时,也会出现相同的问题。
服务器控制台或浏览器中没有错误。我已经使用Visual Studio调试器逐步完成了该应用程序,它正在查找路由,从服务器的角度访问数据库并从服务器的角度出发,每次都完成请求而没有错误。在浏览器中,当它崩溃时,它会出现在控制台中,这似乎是在接受一点点标记-仅<html><title>....</title><body></body></html>
,没有其他。
发生这种情况时,重新启动节点服务器无效。唯一的解决方案是打开一个新的浏览器选项卡,然后再次发出请求-100%的时间有效。谁能解释这种现象,以及如何诊断问题?
该应用使用mysql,express,express-myconnection和ejs库在本地托管。该应用程序的基本结构如下:
app.use(myConnection(mysql, dbOptions, "pool"));
app.set("view engine", "ejs");
var scraper = require("./routes/scraper");
var cookieParser = require("cookie-parser");
var session = require("express-session");
app.use(cookieParser("keyboard cat"));
app.use(
session({
secret: "keyboard cat",
resave: false,
saveUninitialized: true,
cookie: { maxAge: 60000 }
})
);
app.get("/siteReview/(:id)", function(req, res, next) {
const sourceId = req.params.id;
req.getConnection(function(error, conn) {
conn.query(`select website_data from orgs where id = ` + sourceId, function(err, rows) {
if (err) throw err;
res.render("siteReview", {
title: "Site review",
orgId: sourceId,
websiteData: JSON.parse(rows[0].website_data)
});
});
});
});
首先向显示的一个请求处理程序中添加一些错误处理,因此,如果存在任何错误,则仍会处理该请求并发送错误状态,并且您将在服务器上获得适当的日志记录:
app.get("/siteReview/(:id)", function(req, res) {
const sourceId = req.params.id;
req.getConnection(function(error, conn) {
if (error) {
console.log("error on req.getConnection()", error);
res.sendStatus(500);
return;
}
conn.query(`select website_data from orgs where id = ` + sourceId, function(err, rows) {
if (err) {
console.log("error on conn.query()", err);
res.sendStatus(500);
return;
}
res.render("siteReview", {
title: "Site review",
orgId: sourceId,
websiteData: JSON.parse(rows[0].website_data)
});
});
});
});
我不知道这是否会引起您所看到的确切问题,但这是修复并确保没有任何来自浏览器的请求被放弃并留在那里最终超时的好第一步。
然后,如果问题仍然存在,建议您打开Chrome开发者工具,然后查看“网络”标签。然后,从浏览器到您的服务器寻找某种未完成但仍处于打开状态的请求,等待完成。它很可能不是主页的URL,而可能是页面在初始化自身和加载其所有资源的过程中正在执行的其他资源或Ajax调用。
而且,您永远不要编写此行代码:
if (err) throw err;
在普通的异步回调中。所做的一切就是将异常放回回调所来自的任何异步系统的肠道,您的代码无法处理该异常。曾经在他们的编码示例中展示过node.js文档,对此感到羞耻。永远都不是编写此类错误处理的正确方法。如果要扔东西,则必须扔到可以抓住它的东西上。像这两种普通的异步回调都无法为您的代码提供捕获该异常的方法,因此,它无法处理,这对服务器总是不利的。