публиковать в SQL Server API с Express.js - PullRequest
0 голосов
/ 04 декабря 2018

Я тестировал Apis с Express.js из базы данных SQL Server.С get у меня нет проблем, но я не могу опубликовать.

Это код y:

    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 server = app.listen(process.env.PORT || 8080, function () {
    var port = server.address().port;
    console.log("App now running on port", port);
});

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) {
    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.

В списке ошибок все мои поля с одинаковой ошибкой.Формат каждого поля это нормально.Я отправляю данные в виде почтальона следующим образом:

{
    "EmployeeNumber": "9",
    "PeriodBegin": "2018-10-15",
    "PeriodEnd": "2019-10-15",
    "WorkedYears": "6",
    "DaysPerYear": "18",
    "TakenDays": "0",
    "RemainingDays": "18"
}

Кто-то знает, почему мне не разрешается публиковать информацию?

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

--- EDITION ---

Я нашел два решения.Первое решение следующее:

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

С таким кодом я мог бы сделать пост.Но были некоторые комментарии, что таким образом это немного опасно, потому что легче внедрить SQL-атаку.И нашел другое решение: На const executeQuery нужно добавить parameters вот так:

const executeQuery = function (res, query, parameters) {
    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

            parameters.forEach(function (p) {
                request.input(p.name, p.sqltype, p.value);
            });

            request.query(query, function (err, result) {
                if (err) {
                    console.log("Error al correr query en la base: " + err);
                    res.send(err);
                }
                else {
                    res.send(result);
                    sql.close();
                }
            });
        }
    });
}

Затем на app.post:

app.post("/api/HolidayBaseApi", function (req, res) {
    var parameters = [
        { name: 'EmployeeNumber', sqltype: sql.Int, value: req.body.EmployeeNumber },
        { name: 'PeriodBegin', sqltype: sql.VarChar, value: req.body.PeriodBegin },
        { name: 'PeriodEnd', sqltype: sql.VarChar, value: req.body.PeriodEnd },
        { name: 'WorkedYears', sqltype: sql.Int, value: req.body.WorkedYears },
        { name: 'DaysPerYear', sqltype: sql.Int, value: req.body.DaysPerYear },
        { name: 'TakenDays', sqltype: sql.Int, value: req.body.TakenDays },
        { name: 'RemainingDays', sqltype: sql.Int, value: req.body.RemainingDays },
    ];
    var query = "INSERT INTO [HolidaysBase] (EmployeeNumber, PeriodBegin, PeriodEnd, WorkedYears, DaysPerYear, TakenDays, RemainingDays) VALUES (@EmployeeNumber, @PeriodBegin, @PeriodEnd, @WorkedYears, @DaysPerYear, @TakenDays, @RemainingDays)";
    executeQuery(res, query, parameters);
});

Так же работает

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