我使用nodejs和繁琐的连接器从mssql服务器获取数据。在文档中,我只看到这种检索数据的方法
var request = new Request("select Name, Value, Article_Id from [tableone] where Id = '1'", function (err, rowCount, rows) {
if (err) {
console.log(err);
} else {
console.log(rowCount + ' rows');
}
});
request.on('row', function (rows) {
...
bigArrat.push(JSON.stringify(rows));
});
但在我的例子中,我想要所有行,不仅仅是一个属性,而是更多。目前,它在单独的行中返回一个单元格,例如。 rows [0] .value将返回Name,rows [1] .value Value ...对我来说它是垃圾。
我想获取对象的json数组中的所有信息,而不是所有元数据或一个属性。有一种方法可以做到这一点,或者有更好的连接器用于nodejs和sqlserver?
答案 0 :(得分:8)
发送到初始回调的行值是要发回的行数组:
var request = new Request("select Name, Value, Article_Id from [tableone] where Id = '1'", function (err, rowCount, rows) {
if (err) {
console.log(err);
} else {
console.log(rowCount + ' rows');
}
console.log(rows) // this is the full array of row objects
// it just needs some manipulating
jsonArray = []
rows.forEach(function (columns) {
var rowObject ={};
columns.forEach(function(column) {
rowObject[column.metadata.colName] = column.value;
});
jsonArray.push(rowObject)
});
return callback(null, rowCount, jsonArray);
});
答案 1 :(得分:7)
在Sql Server 2016中,您可以使用FOR JSON选项将查询结果格式化为JSON文本,请参阅https://msdn.microsoft.com/en-us/library/dn921882.aspx
您只需要读取查询返回的JSON片段。
答案 2 :(得分:2)
将此添加到您的配置中。
rowCollectionOnRequestCompletion:true
var config = {
userName: '', // update me
password: '', // update me
server: '', // update me
options: {
database: '', // update me
encrypt: true,
rowCollectionOnRequestCompletion: true
}
}
然后,在您的查询中,您现在可以获取行的数据。
var executeQuery = (res,query) => {
request = new Request(query, (err, rowCount, rows) => {
console.log("Rows: ", rows);
res.send(rows);
});
connection.execSql(request);
}
我从以下方面学到了: http://tediousjs.github.io/tedious/api-request.html
修改强>
更新不拥有元数据:
var data = []
request = new Request(query, (err, rowCount, rows) => {
if(err) {
console.log(err)
res.send({ status: 500, data: null, message: "internal server error."})
} else {
console.log(rowCount+' row(s) returned')
res.send({ status: 200, data: data, message: "OK"})
}
})
request.on('row', function(row){
data.push({
last_name: row[0].value,
first_name: row[1].value
})
})
connection.execSql(request)
答案 3 :(得分:1)
我试过这种方式,但它对我不起作用或许我对js和回调的了解不够好。所以,这是我的解决方案。我不得不在连接配置中添加内容以使请求行工作。你也必须这样做。转到:新请求部分的末尾和行。 here 第二件事,我做的很简单。
var jsonArray = [];
var rowObject= {};
var request = new Request("SELECT TOP 5 * FROM tableName",function(err,rowCounts,rows)
{
if (err)
{
console.log(err);
}
else
{
console.log(rowCounts + " rows returned");
}
//Now parse the data from each of the row and populate the array.
for(var i=0; i < rowCounts; i++)
{
var singleRowData = rows[i];
//console.log(singleRowData.length);
for(var j =0; j < singleRowData.length; j++)
{
var tempColName = singleRowData[j].metadata.colName;
var tempColData = singleRowData[j].value;
rowObject[tempColName] = tempColData;
}
jsonArray.push(rowObject);
}
//This line will print the array of JSON object.
console.log(jsonArray);
并向您展示我的connection.config如何:
static config: any =
{
userName: 'username',
password: 'password',
server: 'something.some.some.com',
options: { encrypt: false, database: 'databaseName' ,
rowCollectionOnRequestCompletion: true }
};//End: config
这就是我将它传递给连接的方式。
static connection = new Connection(Server.config);
答案 4 :(得分:0)
补充@Jovan MSFT的答案:
var request = new Request('select person_id, name from person for json path', function(err) {
if (err) {
console.log(err);
}
connection.close();
});
最后,在row
事件中:
request.on('row', function(columns) {
var obj = JSON.parse(columns[0].value);
console.log(obj[0].name);
});
P.S .:上面的代码不会在columns
参数上进行迭代,因为for json path
在单个行和列中返回单个对象数组。
答案 5 :(得分:0)
如果您在服务器端使用Express,我建议您使用Express4乏味(请参阅https://www.npmjs.com/package/express4-tedious)。它允许使用少量代码轻松编写用于SQL连接的api,并将json结果流传输到响应。
连接:
var express = require('express');
var tediousExpress = require('express4-tedious');
var app = express();
app.use(function (req, res, next) {
req.sql = tediousExpress(req, {connection object});
next();
});
Api示例:
/* GET from tableone, streams json result into response */
router.get('/', function (req, res) {
req.sql("select Name, Value, Article_Id from [tableone] where Id = '1' for json path")
.into(res);
});
然后您可以调用这些api,例如从前端开始。
答案 6 :(得分:0)
在返回的行中应用 map-reduce 函数:
rows.map(r=>{
return r.reduce((a,k)=>{
a[k.metadata.colName]=k.value
return a
}
,{})
})