Я все еще работаю с 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.