使用mssql崩溃节点应用程序的SQL Server查询

时间:2015-02-03 21:48:14

标签: sql-server node.js

我一直在开发一个使用mssql模块连接到SQL Server数据库的node.js应用程序,但是我碰到了墙。

基本上,mssql似乎有一些错误,如果任何类型的查询结果返回一定数量的记录,它只会崩溃应用程序。没什么太重的。我说的是50到100条记录!

这也不是特定于查询的。无论结果是什么,它都会发生在我的所有查询中。

如果我限制它们返回10,20,40条记录(使用“SELECT TOP x ...”),查询运行正常,但是一旦我将限制增加到更多的记录,应用程序就会崩溃没有一条错误消息。没有例外。什么都没有。

开始发生的实际记录数因查询而异。看起来好像mssql有错误或设计限制会影响它可以返回的数据量。

我错过了什么吗?我有没有设置我应该改变以避免这种情况?或者,是否还有其他可用于连接SQL Server的npm?

毋庸置疑,这对我来说是个噱头。我应该完全抛弃node.js吗?

关键是,如果我找不到正确的方法连接到SQL Server,那么我将无法将node.js用于此应用程序,并且必须切换到其他内容。

谢谢!

更新1

以下是导致此问题的代码的一部分:

// Basic modules
var express = require("express");
var bodyParser = require("body-parser");

// Custom modules
var settings = require("./lib/settings.js").GetSettings();

var app = express();

app.use(bodyParser.json());
app.use('/', express.static(__dirname + "/public"));

/***************************************************************************************************************/
// Routes

app.get("/GetBrands", function(req, res) {
    var sql = require('mssql');

    var config = {
        user: settings.DatabaseConfiguration.user,
        password: settings.DatabaseConfiguration.password,
        server: settings.DatabaseConfiguration.server,
        database: settings.DatabaseConfiguration.database
    };

    var cmd = "SELECT TOP 5 * FROM Brands WHERE Status = 'a'";

    var connection = new sql.Connection(config, function(err) {
        // ... error checks
        if (err) {
            console.log(err);
        }

        // Query

        var request = new sql.Request(connection); // or: var request = connection.request();
        request.verbose = true;

        request.query(cmd, function(err, recordset) {
            // ... error checks
            if (err) {
                console.log(err);
            }

            console.log(recordset);

            connection.close();
        });
    });
});


/***************************************************************************************************************/

// Enable the port listening.
app.listen(process.env.PORT || 8050);

如果我将“SELECT TOP 5 * ...”的SQL语句更改为更大的数字,例如60,80或100,则应用程序崩溃。此外,响应只是每个品牌的名称和ID。没有太复杂或沉重的。

更新2:

这些是我遵循的步骤,它总是使应用程序崩溃:

  1. 输入命令行:node app.js
  2. 运行应用程序
  3. 在网络浏览器中,转到http://localhost:8050/GetBrands。第一次,我得到的结果很好。没有崩溃。
  4. 第二次运行它。该应用程序崩溃。每一次。
  5. 我还发现了别的东西。我正在使用WebStorm来编辑代码。如果我从那里启动调试器,我没有崩溃,没有任何问题。该应用程序正常工作。当我直接从命令行运行它时,它只会崩溃,或者在没有调试器监听的情况下从WebStorm运行它...这有多疯狂?

    我尝试使用与WebStorm调试器使用的相同的命令行参数,但没有区别。

    我希望有人能尽快得出一些消息,因为我非常接近于为这个项目完全删除node.js。感谢这一点。

    我可以切换到使用不同的SQL Server npm包,但是那个呢?我已经尝试过mssql,node-sqlserver-unofficial和乏味,它们都有相同的问题所以我猜这是TDS的一个问题。

1 个答案:

答案 0 :(得分:0)

通过使用流式界面,您可以显着降低开销,并允许更好地处理非常大的查询结果。我使用流媒体界面,例如使用管道导出文件(csv和xml)。

通过一个相对简单的测试,我能够崩溃节点本身加载一个带有36个字符的字符串的非常大数组(使用uuid.v4()生成),它发生在我大约1GB的使用。我的猜测是,在正在运行的实例中允许的一些引用存在硬限制。