Я пытаюсь сохранить данные в моей базе данных MySql из метода Node. Это включает в себя поле под названием attachments.
console.log(JSON.stringify(post.acf.attachments[0]));возвращает:
{
"ID": 4776,
"id": 4776,
"title": "bla",
"filename": "bla.pdf",
"filesize": 1242207,
"url": "https://example.com/wp-content/uploads/bla.pdf",
"link": "https://example.com/bla/",
"alt": "",
"author": "1",
"description": "",
"caption": "",
"name": "bla",
"status": "inherit",
"uploaded_to": 0,
"date": "2020-10-23 18:05:13",
"modified": "2020-10-23 18:05:13",
"menu_order": 0,
"mime_type": "application/pdf",
"type": "application",
"subtype": "pdf",
"icon": "https://example.com/wp-includes/images/media/document.png"
}
Это действительно данные, которые я хочу сохранить в БД:
await existing_post.save({
...
attachments: post.acf.attachments[0],
)};
Однако поле вложений выдает ошибку сервера 422 (если я закомментирую это поле, другие поля без проблем сохранятся в БД). Я не понимаю, что вызывает эту ошибку. Любые идеи?
я тоже пробовал
await existing_post.save({
...
attachments: post.acf.attachments,
)};
но тогда кажется, что просто сохранить "[object Object]"в базе данных.
Поле в базе данных определяется как текст. Я также пробовал, определяя поле как json, но это не имело значения.
exports.up = function (knex, Promise) {
return knex.schema.table("posts", function (table) {
table.longtext("attachments");
});
};
Решение проблемы
Код ошибки 422 говорит о том, что сервер не может обработать данные, которые вы ему отправляете. В вашем случае ваше поле таблицы выглядит longtextкак post.acf.attachmentsобъект. Вот почему он сохраняется [object Object]в вашей базе данных (это возвращаемое значение toString()метода).
Попробуйте использовать
await existing_post.save({
...
attachments: JSON.stringify(post.acf.attachments),
)};
MySQL и knex поддерживают формат JSON, я бы посоветовал вам изменить поле на json. (Видеть. документы knex и документы mysql 8 ). Вам все равно нужно будет упорядочить свои объекты.
РЕДАКТИРОВАТЬ: я только что увидел, что Knex поддерживает jsonInsert (и множество других полезных вещей) в качестве построителя запросов, который должен быть вам полезен. Mysql также поддерживает большое количество интересных вещей для обработки jsons.
Кроме того, когда вы получаете результаты в базе данных, вам нужно проанализировать результат JSON, чтобы получить фактический объект JSON:
const acf = await knex('posts').select('acf').first();
const attachment = JSON.parse(acf.attachment;
Knex также предоставляет jsonExtract, который должен удовлетворить ваши потребности (см. также mysql json_extract
Комментариев нет:
Отправить комментарий