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 }); 

});