Node Express mssql возвращает формат json без сериализатора и имени объекта

#sql-server #json #node.js #express #ember.js

#sql-сервер #json #node.js #экспресс #ember.js

Вопрос:

Я использую Node express для серверной части моего приложения для извлечения данных из базы данных MSSQL. Я хочу обратиться к этому серверу с помощью другого приложения, созданного с помощью Ember. Ember DS не знает, как обращаться с форматом, возвращаемым MSSQL.

Формат, возвращаемый MSSQL, имеет вид:

 [{  
    "var1": "abc",
    "var2": "def",
    "var3": 3
{ 
    ... 
}]
  

И, если правильно понято, должно быть в виде:

 {
    'modelName': [{     
        "_id": 1
        "var1": "abc",
        "var2": "def",
        "var3": 3
    },
    { 
        ... 
    }]
}
  

Следовательно, в нем отсутствуют как имя записи (ModelName), так и идентификатор / Serial. Я хочу исправить это на экспресс-сервере, а не в сериализаторе приложения Ember. Я не могу найти, как изменить вывод JSON MSSQL в Express на тот, который понимает Ember.

Конечная точка API выглядит следующим образом:

 var express = require('express');
var app = express();

app.use(function(req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:4200');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    res.header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS');
    next();
});

app.get('/api/data', function (req, res) {

  var sql = require("mssql");

  // config for your database
  var config = {
    user: 'user',
    password: 'pass',
    server: 'mssql-server',
    database: 'db'
  };

  // connect to your database
  sql.connect(config, function (err) {

    if (err) console.log(err);

    // create Request object
    var request = new sql.Request();

    // query to the database and get the records
    request.query('SELECT * [dbo].[table]',
      function (err, recordset) {
        if (err) console.log(err)

        // send records as a response
        res.send(recordset);

    });
  });
});

var server = app.listen(8080, function () {
  console.log('Server is running on localhost:8080...');
});
  

Помощь будет высоко оценена!

Я использую (и должен придерживаться) MSSQL 14.

Комментарии:

1. Кстати, я нашел этот пост, в котором рассматривается та же проблема. Просто не могу найти, как исправить мой. discuss.emberjs.com/t /…

2. Вы имеете в виду, что хотите предоставить это как API на экспресс-сервере? Вы должны опубликовать конечную точку, которая будет это делать.

3. Я добавил код для конечной точки API @RobertMoskal

Ответ №1:

Вам просто нужно преобразовать ваш набор записей в желаемый формат. Вы можете выполнить итерацию по вашему набору результатов и добавить _id к каждому

 recordset = recordset.map(each=>{
     each._id = someFunction();
     return each;
 });
res.send({modelName: recordset})
  

Затем добавьте их в ключ ModelName ваших результатов. Вы можете рассмотреть возможность использования модуля uuid для присвоения уникального идентификатора. Просто npm устанавливает uuid. Затем:

 var uuid = require('uuid');
each._id = uuid.v4(); 
  

Комментарии:

1. Это действительно добавило имя объекта, есть ли простой способ добавить (случайный) _id также?

2. Это немного сложнее. Позвольте мне кое-что попробовать.