Azure中的Node.js + Express应用程序击中了500个自己修复的错误
我有一个使用Express 3.4.4的Node.js 4.4.7应用程序有这个神秘的问题。 如果我导航到www.mydomain.com
有时会遇到500服务器错误。 需要注意的是,这里的主页进行数据库调用。 紧接着发生这种情况,如果我导航到www.mydomain.com/login
页呈现罚款。 没有数据库交易发生在这个页面上。 从login页面,我可以按导航栏中的Home
,我将被带到www.mydomain.com/
和页面渲染罚款。
就好像数据库或Web应用程序实例进入睡眠状态并需要唤醒一样。 所以我在我的应用程序设置中启用了Always On
,但是这并没有解决问题。 我还创build了一些警报testing,将一些stream量推送到站点,以便它永远不会入睡。 这有点帮助,但偶尔我会得到警报电子邮件,我的pingtesting仍然失败。
当pingtesting失败时,我可以立即成功loginwww.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错误然后是好的。 我知道这不是来自破坏代码,因为这可以通过简单地在任何文件中提交评论来复制。
我发现这篇文章似乎遇到类似的症状,将故障放在Azure负载平衡器上。
Azure日志stream
我的网站现在工作正常,但为了让日志stream显示错误,我执行了以下步骤。
-
cd MyApp/
-
echo "test" >> delete-me.txt
-
git add delete-me.txt
-
git commit -m "test to make 500 error"
-
git push
而且一旦我刷新我的网站,毫不奇怪,它会遇到500错误。 我打开了日志,这个连接错误显示在mssql
Node模块中。 再次,我能够通过去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数据库但是在本地工作时,我从来没有遇到这个错误,只是我的应用程序的部署版本遇到了这个问题。 我已经阅读了许多人遇到这个问题的GitHub问题。 那里有解决办法吗?
编辑添加显示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(); });
我的猜测是,问题在于数据库连接(因此,为什么它发生在你启动应用程序时)。
我build议有一个不同的模块,你做数据库连接和查询逻辑,然后在你的路线中使用它。
简单的build议。
有另一个名为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 });
});