#javascript #jquery #ajax #postgresql
#javascript #jquery #ajax #postgresql
Вопрос:
Добрый день
Я пытаюсь отправить запрос Ajax post с помощью jquery.
Для этой цели я использую загрузочный модал для сбора данных и отправки в PostgreSQL DB.
Данные передаются в раздел визуализации с использованием EJS.
Итак, в итоге я получаю неопределенное значение данных POST request.
я помечаю, чтобы запустить модальный
<span data-toggle="tooltip" data-placement="bottom" title="Edit task">
<a data-toggle="modal" data-target="#editTaskModal">
<i class="editTask fas fa-pencil-alt" data-id="<%= task.id%>" data-description="<%= task.description%>"></i>
</a>
</span>
</span>
Модальный
<div class="modal fade" id="editTaskModal" tabindex="-1" aria-labelledby="editTaskModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<form class="" action="/edit" method="post">
<input type="hidden" id="editTaskId" name="id" value="" />
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Edit Task</h5>
</div>
<div class="modal-body">
<div class="input-group">
<div class="input-group-prepend">
</div>
<input autocomplete="off" id="editTaskDescription" name="taskDescription" class="form-control" aria-label="With textarea"></input>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<button type="button" class="confirmEditTask btn btn-primary">Edit Task</button>
</div>
</form>
</div>
</div>
</div>
Скрипт Jquery для обработки данных
Я беру значение предыдущей записи и помещаю в модальную форму ввода для редактирования. Скопируйте также идентификатор элемента, чтобы он соответствовал элементу базы данных, и обновите.
$(document).on("click", '.editTask', function() {
$("#editTaskDescription").val($(this).attr('data-description'));
$("#editTaskId").val($(this).attr("data-id"));
var id = $(this).attr("data-id");
var url = '/edit/' id;
$(".confirmEditTask").on("click", function(event) {
const newDescription = $("#editTaskDescription").val()
alert(newDescription)
if (!null) {
$.ajax({
type: "POST",
url: url,
data: newDescription,
success: function(result) {
$("#editTaskModal").modal('hide')
console.log("editing task");
window.location.href = '/'
},
error: function(err) {
console.log(err);
}
})
}
})
})
})
SQL-запрос
Чтобы проверить, что такое req.params.newDescription, я регистрирую его и вижу, что оно «не определено».
// Edit task by ID
app.post('/edit/:id', function(req, res) {
console.log(req.params.newDescription);
pool.query("UPDATE tasks SET description=$1 WHERE id=$2", [req.params.newDescription, req.params.id]);
res.sendStatus(200);
})
Пожалуйста, сообщите, как запрос Jquery Ajax POST должен передавать ДАННЫЕ на сервер. Тип данных столбца «описание» может варьироваться в зависимости от символа. Сталкиваюсь ли я с проблемой несовместимости типов данных?
Комментарии:
1. Передайте данные в виде пары ключ-значение, например so — var data = {param:$(«#editTaskDescription»).val()} . После того как вы создали свой объект, передайте его в ajax-запрос. Jquery сериализует этот объект для вас. вы можете экранировать любые специальные символы с помощью encodeURIComponent() ИЛИ encodeURI() — developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…
2. @JoeZ, спасибо вам за ваши комментарии. Это сработало, но теперь он принимает в качестве входных данных только цифры, но не буквы. Если я пытаюсь добавить буквы, это выдает мне ошибку «Синтаксическая ошибка Json». Есть идеи, что с этим делать?. Поправка: Все работает просто отлично. Большое спасибо
3. рад, что у вас все получилось! Я перенес это в раздел «Ответы», чтобы внести больше ясности в этот вопрос и убедиться, что он будет виден как решение для всех, у кого есть аналогичная проблема. Если мой ответ сработал для вас, пожалуйста, примите его.
Ответ №1:
Данные, которые вы передаете в свой ajax-запрос, неверны. Создайте свой объект в пару ключ-значение и передайте его в запрос. Вот один из примеров. Вы можете использовать encodeURIComponent() ИЛИ encodeURI()для экранирования любых специальных символов и можете найти документ здесь —
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI
var data = {"newDescription": $("#editTaskDescription").val()}
Ответ №2:
вы так закрываете, что данные должны быть просто объектом, подобным ключу словаря, а затем значению, где ключом всегда является текст …. смотрите ниже
предполагается, что принимающее имя конечных точек для его параметра равно «newDescription»
например
[HttpPost("edit/{id}")]
public ActionResult Edit([FromUrl]string id,[FromBody] string newDescription)
{
}
$(document).on("click", '.editTask', function() {
$("#editTaskDescription").val($(this).attr('data-description'));
$("#editTaskId").val($(this).attr("data-id"));
var id = $(this).attr("data-id");
var url = '/edit/' id;
$(".confirmEditTask").on("click", function(event) {
const newDescription = $("#editTaskDescription").val()
if (!null) {
$.ajax({
type: "POST",
url: url,
data: {"newDescription": newDescription },
success: function(result) {
},
error: function(err) {
console.log(err);
}
})
}
})
})
})
например
[HttpPost()]
public ActionResult Edit(int id, string name)
{
}
тогда данные будут
var data = {"id": 232, "name": "SomeFancyName" },
$.ajax({
type: "POST",
url: url,
data: data,
success: function(result) {
},
error: function(err) {
console.log(err);
}
})