【发布时间】:2019-12-12 09:01:24
【问题描述】:
我的 Node JS Web 应用程序有一些非常不稳定的行为。对于某些路线,页面将加载一次 - 但任何尝试单击应用程序中其他位置的链接或页面刷新都将不起作用。浏览器会变白,加载器永远旋转。有些页面更不稳定 - 它们可以正常工作,但可能在第 15 个页面加载时,同样的问题会出现。
服务器控制台或浏览器中没有错误。我已经使用 Visual Studio 调试器逐步完成了该应用程序,它正在查找路线、访问数据库并从服务器的角度来看,每次都完成请求而不会出错。在浏览器中,当它崩溃时,它会出现在控制台中,它似乎正在接收一点点标记 - 只是 <html><title>....</title><body></body></html>,但没有别的。
发生这种情况时,重新启动 Node 服务器无效。唯一的解决方案是打开一个新的浏览器选项卡,然后再次发出请求——这在 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)
});
});
});
});
【问题讨论】:
-
我建议您打开 Chrome 开发者工具并查看网络选项卡。然后,查找从浏览器到您的服务器的某种未完成且仍处于打开状态、等待完成的请求。
-
仅供参考,您展示的一个请求处理程序根本没有错误处理。因此,如果
req.getConnection()或con.query()出现错误,则不会向浏览器发送任何内容,并且该请求处理程序就坐在那里,最终超时。您应该处理服务器上的所有错误,并在您的服务器出现错误时发送某种错误状态(可能是 5xx)。if (err) throw err永远不应该像您一样在普通的异步回调中使用,因为没有人可以捕获并适当地处理它,并且由于它是异步的,因此无法在更高级别上捕获它。