Почему Express API возвращает два объекта с одинаковыми данными? - PullRequest
0 голосов
/ 06 декабря 2018

Я создаю API с Express и SQL Server в качестве БД.Я создал метод post, и он отлично работает, но у меня проблемы с методом get, потому что он возвращает два объекта с одинаковыми данными.Это мой код:

const express = require('express');
const bodyParser = require('body-parser');
const sql = require('mssql');
const app = express();

app.use(bodyParser.json());

app.use(function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, contentType,Content-Type, Accept, Authorization");
    next();
});


const dbConfig = {
    user: "theUser",
    password: "thePass",
    server: "theServer",
    database: "theDB"
}

const executeQuery = function (res, query) {
    sql.connect(dbConfig, function (err) {
        if (err) {
            console.log(err);
            res.send(err);
        }
        else {
            // create Request object
            var request = new sql.Request();


            // query to the database
            request.query(query, function (err, result) {
                if (err) {
                    console.log(err);
                    res.send(err);
                }
                else {
                    res.send(result);
                    sql.close();
                }
            });
        }
    });
}

//Get All
app.get("/api/HolidayBaseApi", function (req, res) {
    var query = "SELECT * FROM [HolidaysBase]";
    executeQuery(res, query);
    //executeQuery(res, query);
});


app.post("/api/HolidayBaseApi", function (req, res) {
    var query = "INSERT INTO [HolidaysBase] (EmployeeNumber, PeriodBegin, PeriodEnd, WorkedYears, DaysPerYear, TakenDays, RemainingDays) VALUES ('"+req.body.EmployeeNumber+"','"+req.body.PeriodBegin+"','"+req.body.PeriodEnd+"','"+req.body.WorkedYears+"','"+req.body.DaysPerYear+"','"+req.body.TakenDays+"','"+req.body.RemainingDays+"')";
    executeQuery(res, query);
});


const PORT = process.env.PORT || 8080

app.listen(PORT, () => {
    console.log("App now running on port", PORT);
});

Я тестирую на почтальоне и получаю следующее возвращение:

    {
    "recordsets": [
        [
            {
                "Id": 1,
                "EmployeeNumber": 4,
                "PeriodBegin": "2018-04-01T00:00:00.000Z",
                "PeriodEnd": "2019-03-31T00:00:00.000Z",
                "WorkedYears": 6,
                "DaysPerYear": 18,
                "TakenDays": 10,
                "RemainingDays": 8
            },
            {
                "Id": 2,
                "EmployeeNumber": 5,
                "PeriodBegin": "2018-08-02T00:00:00.000Z",
                "PeriodEnd": "2018-07-31T00:00:00.000Z",
                "WorkedYears": 6,
                "DaysPerYear": 18,
                "TakenDays": 9,
                "RemainingDays": 9
            },
            {
                "Id": 5,
                "EmployeeNumber": 9,
                "PeriodBegin": "2018-10-15T00:00:00.000Z",
                "PeriodEnd": "2019-10-15T00:00:00.000Z",
                "WorkedYears": 6,
                "DaysPerYear": 18,
                "TakenDays": 0,
                "RemainingDays": 18
            }
        ]
    ],
    "recordset": [
        {
            "Id": 1,
            "EmployeeNumber": 4,
            "PeriodBegin": "2018-04-01T00:00:00.000Z",
            "PeriodEnd": "2019-03-31T00:00:00.000Z",
            "WorkedYears": 6,
            "DaysPerYear": 18,
            "TakenDays": 10,
            "RemainingDays": 8
        },
        {
            "Id": 2,
            "EmployeeNumber": 5,
            "PeriodBegin": "2018-08-02T00:00:00.000Z",
            "PeriodEnd": "2018-07-31T00:00:00.000Z",
            "WorkedYears": 6,
            "DaysPerYear": 18,
            "TakenDays": 9,
            "RemainingDays": 9
        },
        {
            "Id": 5,
            "EmployeeNumber": 9,
            "PeriodBegin": "2018-10-15T00:00:00.000Z",
            "PeriodEnd": "2019-10-15T00:00:00.000Z",
            "WorkedYears": 6,
            "DaysPerYear": 18,
            "TakenDays": 0,
            "RemainingDays": 18
        }
    ],
    "output": {},
    "rowsAffected": [
        3
    ]
}

Как видите, он возвращает два раза один и тот же объект.Кто-то знает, почему он возвращает два набора записей и как я могу это исправить?Я искал со вчерашнего дня, но нет информации об этом поведении.

Я использую Express.js, Node и SQL Server.

1 Ответ

0 голосов
/ 07 декабря 2018

Я нашел решение сам.На моем executeQuery просто нужно попасть внутрь recordsets в результате:

const executeQuery = function (res, query) {
    sql.connect(dbConfig, function (err) {
        if (err) {
            console.log(err);
            res.send(err);
        }
        else {
            // create Request object
            var request = new sql.Request();

            // query to the database
            request.query(query, function (err, result) {
                if (err) {
                    console.log(err);
                    res.send(err);
                }
                else {
                    res.send(result.recordsets);
                    sql.close();
                }
            });
        }
    });
}

При этом у меня есть своего рода объект внутри объекта в качестве ответа:

[
  [
    {
        "Id": 1,
        "EmployeeNumber": 4,
        "PeriodBegin": "2018-04-01T00:00:00.000Z",
        "PeriodEnd": "2019-03-31T00:00:00.000Z",
        "WorkedYears": 6,
        "DaysPerYear": 18,
        "TakenDays": 10,
        "RemainingDays": 8
    },
    {
        "Id": 2,
        "EmployeeNumber": 5,
        "PeriodBegin": "2018-08-02T00:00:00.000Z",
        "PeriodEnd": "2018-07-31T00:00:00.000Z",
        "WorkedYears": 6,
        "DaysPerYear": 18,
        "TakenDays": 9,
        "RemainingDays": 9
    },
    {
        "Id": 5,
        "EmployeeNumber": 9,
        "PeriodBegin": "2018-10-15T00:00:00.000Z",
        "PeriodEnd": "2019-10-15T00:00:00.000Z",
        "WorkedYears": 6,
        "DaysPerYear": 18,
        "TakenDays": 0,
        "RemainingDays": 18
    },
    {
        "Id": 6,
        "EmployeeNumber": 37,
        "PeriodBegin": "2018-07-27T00:00:00.000Z",
        "PeriodEnd": "2019-07-27T00:00:00.000Z",
        "WorkedYears": 4,
        "DaysPerYear": 16,
        "TakenDays": 3,
        "RemainingDays": 13
    },
    {
        "Id": 7,
        "EmployeeNumber": 77,
        "PeriodBegin": "2018-01-30T00:00:00.000Z",
        "PeriodEnd": "2019-01-30T00:00:00.000Z",
        "WorkedYears": 6,
        "DaysPerYear": 18,
        "TakenDays": 18,
        "RemainingDays": 0
    }
  ]
]

Итак, окончательное решение - войти внутрь объекта и принести первый индекс на request.object:

request.query(query, function (err, result) {
                    if (err) {
                        console.log(err);
                        res.send(err);
                    }
                    else {
                        res.send(result.recordsets[0]);
                        sql.close();
                    }
                });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...