Двойной ответ объекта на Express API - PullRequest
0 голосов
/ 06 декабря 2018

Я все еще работаю с Express.js и SQL Server для создания apis.Прямо сейчас у меня есть три проблемы.Во-первых, я получаю двойной объектный ответ.

Это код mi для API:

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: "daUser",
    password: "daPass",
    server: "daServer",
    database: "daDB"
}


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

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

app.post("/api/HolidayBaseApi", function (req, res) {
    console.log(req.body);
    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);
});

Когда я использую get on Postman, это то, что возвращает:

{
    "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
            }
        ]
    ],
    "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
        }
    ],
    "output": {},
    "rowsAffected": [
        2
    ]
}

В моей БД у меня только две записи, сынок, я получаю две мои записи, но внутри этих же двух записей.Я уже проверил конфигурацию своей БД и сравнил с другими таблицами, и нет причин возвращать двойной ответ.

Следующая проблема возникла с моим постом.Сначала я попробовал с кодом:

app.post("/api/HolidayBaseApi", function (req, res) {
    console.log(req.body);
    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);
})

Но ответ был такой: The multi-part identifier \"req.body.RemainingDays\" could not be bound.Кто-то предлагает мне, чтобы req.body должен был проходить как строка, поэтому я изменил код на:

app.post("/api/HolidayBaseApi", function (req, res) {
    console.log(req.body);
    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);
})

И теперь я получаю: Incorrect syntax near '.'."

ИПоследняя проблема возникает, когда я пытаюсь отправить еще один запрос.Например, допустим, я отправляю свое сообщение, а затем отправляю его снова.Что я получаю:

Error: Global connection already exists. Call sql.close() first.

При поиске в более старом сообщении stackoverflow обнаружен следующий фрагмент кода:

async function execute2(query) {

    return new Promise((resolve, reject) => {

        new sql.ConnectionPool(dbConfig).connect().then(pool => {
            return pool.request().query(query)
        }).then(result => {

            resolve(result.recordset);

            sql.close();
        }).catch(err => {

            reject(err)
            sql.close();
        });
    });

}

Но даже с этим кодом все та же ошибка.

Я знаю, я все еще учусь.Кто-нибудь может мне помочь, пожалуйста.

Как я уже сказал, я использую Express.js, Node и SQL Server.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...