Javascript nodejs tedious mssql有没有一种方法获取Json数据?

6

我正在使用Node.js和Tedious connector从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将返回名称,rows [1] .value Value ...对我来说这是垃圾。

我想获得所有信息的JSON对象数组,而不是所有元数据或一个属性。是否有方法可以做到这一点,或者是否有更好的nodejs和sqlserver连接器?

8个回答

15

发送到您初始回调函数的行值是被发送回来的一系列行的数组:

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

10

1
我不知道为什么这不是答案-将乏味的查询转换为对象数组的最简单方法 - PMac
因为并不是每个人都拥有 SQL Server 2016。 - Hugues Gauthier
1
Azure SQL数据库支持它。非常感谢! - Gustavo Contreiras

4

将此添加到您的配置中。

rowCollectionOnRequestCompletion: true

var config = {
  userName: '', // update me
  password: '', // update me
  server: '', // update me
  options: {
    database: '', // update me
    encrypt: true,
    rowCollectionOnRequestCompletion: true
  }
}

那么在您的查询中,现在可以获取行(rows)的数据。

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)

2
如果您正在服务器端使用Express,我建议使用express4-tedious(参见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。

1

我尝试了那种方法,但对我没有用,也许是因为我的js和回调知识不够好。所以这是我的解决方案。我必须在连接配置中添加一些内容以使请求的行起作用。您也需要这样做。转到:新请求部分的末尾,以及行。 这里 我做的第二件事非常简单。

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

0
这是几个上面回答的结合体。它在SELECT语句中使用{{link1:FOR JSON AUTO}},并将“列”解析为JSON。对于不熟悉此API的人来说,行/列术语可能有点误导性。在这种情况下,第一个“列”的值将是表中行的数组:
var request = new Request("SELECT Name, Value, Article_Id FROM [tableone] WHERE Id = '1' FOR JSON AUTO", function (err, rowCount, rows) {
  if (err) {
    console.log(err);
  } else {
    console.log(rowCount + ' rows');
  }
});
request.on('row', (columns) => {
  const json = JSON.parse(columns[0].value);
});


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

附言:上面的代码没有迭代columns参数,因为for json path返回一个单行单列的对象数组。


0

在返回的行中应用Map-Reduce函数:

rows.map(r=>{
      return r.reduce((a,k)=>{
        a[k.metadata.colName]=k.value
        return a
      }
      ,{})
    })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接