Я тестировал 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);
});
Так же работает