我一直在开发一个使用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:
这些是我遵循的步骤,它总是使应用程序崩溃:
我还发现了别的东西。我正在使用WebStorm来编辑代码。如果我从那里启动调试器,我没有崩溃,没有任何问题。该应用程序正常工作。当我直接从命令行运行它时,它只会崩溃,或者在没有调试器监听的情况下从WebStorm运行它...这有多疯狂?
我尝试使用与WebStorm调试器使用的相同的命令行参数,但没有区别。
我希望有人能尽快得出一些消息,因为我非常接近于为这个项目完全删除node.js。感谢这一点。
我可以切换到使用不同的SQL Server npm包,但是那个呢?我已经尝试过mssql,node-sqlserver-unofficial和乏味,它们都有相同的问题所以我猜这是TDS的一个问题。
答案 0 :(得分:0)
通过使用流式界面,您可以显着降低开销,并允许更好地处理非常大的查询结果。我使用流媒体界面,例如使用管道导出文件(csv和xml)。
通过一个相对简单的测试,我能够崩溃节点本身加载一个带有36个字符的字符串的非常大数组(使用uuid.v4()
生成),它发生在我大约1GB的使用。我的猜测是,在正在运行的实例中允许的一些引用存在硬限制。