#javascript #node.js #loops #express
#javascript #node.js #циклы #экспресс
Вопрос:
Я отправляю запрос с данными в виде массива объектов:
[
{id: "1"},
{id: "2"},
{id: "3"}
]
я использую JSON.stringify()
, и мой req.body выглядит так:
{ '{"id":"1"},{"id":"2"},{"id":"3"}': '' }
Теперь я хочу выполнить цикл через req.body и получить все идентификаторы, чтобы я мог удалить их из базы данных SQL. Я использую Sequelize. Серверная часть:
exports.deleteIds = (req, res, next) => {
console.log(req.body)
//here should be loop so i can delete all the ids one by one.
Model.destroy({
where: {
id:
}
})
}
Запрос post (клиент):
let ids = []
//maybe here is the problem?
for (var i = 0; i < selectedRow.length; i ) {
ids.push({id:selectedData[i].id})
}
let Url = "/admin/deleteIds"
let data = JSON.stringify(ids)
event.preventDefault();
$.post(Url, data, function (data, status) {
}).done(function (res) {
if (res.ids.length == 0) {
$('#mainContent').html('<h1>0 users found</h1>')
}
})
.fail(function (err) {
console.log(err.responseJSON.message)
})
Комментарии:
1. какую библиотеку БД вы используете?, это может быть встроенный ИТ-вариант
2. @Itamar я использую Sequelize
3. смотрите мой ответ ниже
Ответ №1:
Редактировать
Мы делаем все еще проще, отправляя массив идентификаторов и используя его непосредственно на сервере.
Клиент:
let ids = []
for (var i = 0; i < selectedRow.length; i ) {
ids.push(selectedData[i].id) // <-- this is the change
}
let Url = "/admin/deleteIds"
let data = {items: ids}
//...
Сервер:
exports.deleteIds = (req, res, next) => {
const ids = req.body.items; // <-- no mapping needed
Model.destroy({
where: {id: ids}
})
}
Тело POST-вызова должно быть допустимым JSON, что означает, что это должен быть объект js.
Предполагая, что вы используете выборку
Отправка данных на сервер с помощью Fetch API
const rawResponse = await fetch('https://httpbin.org/post', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({items: [ {id: "1"}, {id: "2"}, {id: "3"} ]})
});
Во-первых, если вы получаете req.body как объект, нет причин использовать JSON.stringify
. если нет, используйте анализатор тела JSON.parse
или Express
Во-вторых, у вас, вероятно, есть способ в библиотеке DB отправить несколько идентификаторов для уничтожения.
Если вы используете Sequelize.js например:
exports.deleteIds = (req, res, next) => {
const ids = req.body.items.map(({id}) => id);
Model.destroy({
where: {id: ids}
})
}
В случае, если эта опция не существует, позволяет выполнить цикл:
exports.deleteIds = (req, res, next) => {
req.body.items.forEach(({id}) => {
Model.destroy({
where: {id}
})
})
}
Ваш фиксированный вызов POST:
let ids = []
for (var i = 0; i < selectedRow.length; i ) {
ids.push({id:selectedData[i].id})
}
let Url = "/admin/deleteIds"
let data = {items: ids} // <-- this is the change
event.preventDefault();
$.post(Url, data, function (data, status) {
}).done(function (res) {
if (res.ids.length == 0) {
$('#mainContent').html('<h1>0 users found</h1>')
}
})
.fail(function (err) {
console.log(err.responseJSON.message)
})
Комментарии:
1. Я уже использую анализатор тела в качестве промежуточного программного обеспечения. когда я пытаюсь отправить запрос post с массивом объектов без JSON.stringify
[ {id: "1"}, {id: "2"}, {id: "3"}]
, я получаю{ undefined: [ '', '', '' ] }
(когда консоль. log req.body)2. можете ли вы добавить к вопросу почтовый вызов клиента и обработчик почтового сервера?
3. Спасибо, я попробую это, поэтому просто чтобы убедиться, что я могу изменить свой код в этой строке, чтобы у меня был тот же код, что и у вас, для получения действительных данных json
let data = JSON.stringify({items: ids})
4. Я сделал решение сверху. но я изменил одну вещь, и она работает идеально. я отправляю данные без JSON.stringify:
{items: [ {id: "1"}, {id: "2"}, {id: "3"} ]}
и его работы5. отредактируйте свой ответ и удалите JSON.stringify из решения. я решил сделать это с
const ids = req.body.items.map(({id}) => id);
, и он работает хорошо, спасибо.
Ответ №2:
Как упоминает другой пользователь, req.body всегда должен быть допустимым json, поэтому получение массива маловероятно.
Когда вы получаете действительный запрос json, в Sequelize вы можете использовать три метода:
-
get()
Функция, которая определяет, что вы извлекаете из базы данных:https://sequelize.org/master/manual/getters-setters-virtuals.html -
set()
Метод в модели, который запускает функцию для того, что вы хотите сохранить в базе данных:
const User = sequelize.define('user', {
username: DataTypes.STRING,
password: {
type: DataTypes.STRING,
set(value) {
this.setDataValue('password', hash(value));
}
}
});
- (Вероятно, моя рекомендация здесь) Функция непосредственно на контроллере, как в этом примере, где я указываю название организации:
try {
const result = await Organization.create({
name: req.body.name,
type: req.body.type,
slug: slugify(req.body.name, { lower: true, remove: /[* ~.()'"!:@]/g, strict: true }),
fields: allowedFields
}) catch(err) { etc.}
Комментарии:
1. Ключи объекта не будут работать, поскольку это был массив в вопросе
2. Извините, Итамар, я пропустил это. Будет обновляться. Предлагаемая мной функция create — это всего лишь пример того, как использовать возможность функции встроенного контроллера модели в Sequelize