Javascript nodejs繁琐的mssql是否有办法获取json?

时间:2015-04-02 18:22:32

标签: javascript sql-server node.js

我使用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?

7 个答案:

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