我有一个使用Express 3.4.4的Node.js 4.4.7应用程序,它有这个神秘的问题。如果我导航到www.mydomain.com
,有时我遇到500服务器错误。重要的是要注意这里的主页进行数据库调用。发生这种情况后,如果我导航到www.mydomain.com/login
,页面呈现正常。此页面上不会发生数据库事务。在登录页面上,我可以在导航栏中按Home
,我将被带到www.mydomain.com/
,页面呈现正常。
这几乎就像数据库或Web App实例进入睡眠状态并需要被唤醒。所以我在我的应用程序设置中启用了Always On
,但这还没有解决问题。我还创建了一些警报测试,将一些流量推送到网站,以便它永远不会进入睡眠状态。这有点帮助但偶尔我收到警报电子邮件,我的ping测试仍然失败。
当ping测试失败时,我能够立即成功转到www.mydomain.com/login
,然后成功从该页面导航到“Home”。几分钟后,我收到一条通知,告知我的应用状态是“再次健康。”
mydomain.com/
exports.index = function (req, res) {
var query = "SELECT P.pid, P.title, P.tags, P.topic, P.body_preview FROM Posts P ORDER BY P.date_created DESC";
new req.sql.Request().query(query, function (err, recordset) {
if (err) throw err;
res.render('index', {
rows: recordset
});
});
mydomain.com/login
exports.g_login = function (req, res) {
res.render('auth/login');
}
同样,我将站点设置直接从我的GitHub存储库进行部署。每当我推送到我的主分支时,该网站通常会在几分钟内发出500错误然后就可以了。我知道这不是破坏代码,因为只需在任何文件中提交注释即可复制。
我发现似乎遇到类似症状的this post,将错误放在Azure负载均衡器上。
我的网站现在工作正常,但为了让日志流显示错误,我执行了以下步骤。
cd MyApp/
echo "test" >> delete-me.txt
git add delete-me.txt
git commit -m "test to make 500 error"
git push
一旦我刷新了我的网站,毫不奇怪它会遇到500错误。我打开了日志,这个连接错误显示在mssql
节点模块中。再次,我能够通过转到mydomain.com/login
然后导航到mydomain.com/
来修复500错误。
Express server listening on port \\.\pipe\7a9d4df2-518e-4eb1-afbe-74064c927cbf
Sat Oct 14 2017 23:17:24 GMT+0000 (Coordinated Universal Time): Application has thrown an uncaught exception and is terminated:
ConnectionError: Connection is closed.
at D:\home\site\wwwroot\node_modules\mssql\lib\main.js:1569:17
at nextTickCallbackWith0Args (node.js:420:9)
at process._tickCallback (node.js:349:13)
这是从app.js
var sql = require("mssql");
// Setup for Azure SQL Server
var config = {
user: env.username,
password: env.password,
server: "mydomain.database.windows.net",
database: "blog",
// As per the npm docs, encrypt=true for Azure connections
options: {
encrypt: true
}
};
sql.connect(config, function (err) {
if (err) throw err;
});
另外值得注意的是,我在插入Azure数据库时从未遇到此错误,但在本地工作时,只有我的应用程序的已部署版本才会遇到此问题。我已阅读this GitHub issue,其中有许多人遇到此问题。那里有解决方案吗?
编辑添加揭示SQL对象的中间件。
app.use(function (req, res, next) {
req.highlight = highlight;
req.sessions = sessions;
req.bcrypt = bcrypt;
req.sql = sql;
req.md = md;
req.fs = fs;
next();
});
答案 0 :(得分:1)
我的猜测是问题在于数据库连接(因此,当你启动应用程序时它会发生的原因)。
我建议您使用不同的模块来执行数据库连接和查询逻辑,然后在路径中使用它。
一个简短的建议。
有另一个名为db.js
的文件,并执行类似以下操作:
var sql = require("mssql");
// Setup for Azure SQL Server
var config = {
user: env.username,
password: env.password,
server: "mydomain.database.windows.net",
database: "blog",
// As per the npm docs, encrypt=true for Azure connections
options: {
encrypt: true
}
};
function query(query, callback){
sql.connect(config, function(err) {
if(err) throw err;
new sql.Request().query(query, function (err, result){
if(err) throw err;
callback(result)
});
});
}
module.export = {query : query}
然后您需要路由逻辑中的文件,并执行:
var db = require('../db.js');
exports.index = function (req, res) {
var query = "SELECT P.pid, P.title, P.tags, P.topic, P.body_preview FROM Posts P ORDER BY P.date_created DESC";
db.query(query, function (recordset) {
res.render('index', {
rows: recordset
});
});