Azure中的Node.js + Express应用程序会遇到500个自我修复的错误

时间:2017-10-14 23:42:40

标签: node.js azure express web-applications

我有一个使用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负载均衡器上。

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

1 个答案:

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

});