Helpers - компьютеры, интернет, программирование

Сохранить изображение с URL-адреса в БД в nodejs

Я относительно новичок в nodejs. Я пытаюсь сохранить изображение, указанное в URL-адресе (из API). После некоторых онлайн-исследований я решил использовать метод createWriteStream из nodejs, чтобы извлечь изображение из URL-адреса и сохранить его в локальный каталог. Но я хотел бы иметь возможность сохранять непосредственно в mongodb. Я не могу понять, как изменить пункт назначения на коллекцию в mongodb.

Мой фрагмент кода выглядит следующим образом:

const fs = require('fs');
const request = require('request');
const Image = require('./models/Image');

const connectDB = require('./db');

connectDB();

const imageName = 'photo-' + Date.now();
const ext = 'jpg';


const url = 'https://some_path_for_image_by_api';

const getData = async (u, cb) => {
  const myImage = await request(url).pipe(
    fs.createWriteStream(`${imageName}.${ext}`)
  );
  cb(myImage);
};

const saveData = async (d) => {
  const image = await new Image(d);

  image.save(function (err, data) {
    if (err) return console.error(err);
    else return console.log('Image saved successfully', data);
  });
};

getData(url, saveData);

Вот мое определение схемы изображения:

const mongoose = require('mongoose');

const ImageSchema = new mongoose.Schema({
  createdAt: {
    type: Date,
    default: Date.now,
  },
  img: {
    data: Buffer,
    contentType: String,
  },

module.exports = mongoose.model('Image', ImageSchema);

С помощью этого кода изображение сохраняется с URL-адреса в мой корневой каталог в папке (не желательно). Документ изображения создается, но только с ObjectId и версией, а не с фактическими данными. Цель состоит в том, чтобы иметь возможность сохранить изображение, полученное с URL-адреса, непосредственно в mongodb в виде документа, ничего не сохраняя в корневом каталоге. Может быть, я не делаю правильный путь. Как сохранить его в БД, а не в некоторые папки в каталоге или в корневом каталоге? Любая помощь и предложение будут высоко оценены.



Ответы:


1

Похоже, единственное поле в вашей модели — createdAt, поэтому сами данные изображения не будут сохранены. Чтобы сохранить данные изображения, вам нужно добавить в модель соответствующее поле.

Из документов Мангуста:

Опция strict (включена по умолчанию) гарантирует, что значения, переданные нашему конструктору модели, которые не были указаны в нашей схеме, не будут сохранены в базе данных.

https://mongoosejs.com/docs/guide.html#strict

Изменить после публикации схемы: Попробуйте это.

const ImageSchema = new mongoose.Schema({
  createdAt: {
    type: Date,
    default: Date.now(),
  },
  img: {
    type: Buffer
  }
});

Затем вам нужно установить это поле по имени в вашей модели. Что-то типа:

const image = new Image({ img: d });

где имя поля buffer.

Я не знаком с fs, поэтому мало чем могу помочь, но это предполагает, что d содержит массив байтов. Если в настоящее время это не массив байтов, я думаю, что следующим шагом будет его преобразование в один, чтобы его можно было сохранить в MongoDB. Этот ответ может помочь с этой частью:

https://stackoverflow.com/a/31217387/1520071

10.10.2020
  • Даже если добавить поле в схему как {изображение: {тип: буфер}} Как сохранить в БД при запуске функции? В настоящее время, просто добавив это поле, это изображение не сохраняется в БД. 11.10.2020
  • Можете ли вы обновить свой код в своем вопросе, чтобы отразить это изменение? В противном случае я не могу точно знать, что происходит. С текущим кодом вам все равно нужно установить поле модели в буфер изображения. Не уверен, что вы это уже сделали. Я обновлю свой ответ, чтобы быть более явным по этому поводу. 11.10.2020
  • Просто обновил код схемой изображения и немного разъяснил вопрос. 11.10.2020
  • Красиво, хорошо выглядит. Я думаю, вам нужно немного изменить модель. Попробуйте img: Buffer. Я снова обновлю свой ответ. Изменить: я заметил, что значение по умолчанию для createdAt могло быть установлено неправильно из-за отсутствия скобок. Я тоже добавил их к своему предложению. Это должно по крайней мере исправить, что createdAt не заполняется. 11.10.2020
  • Получение этого: { img: { CastError: Ошибка приведения к буферу для значения WriteStream { ......| messageFormat: не определено, тип: «Буфер», значение: [WriteStream], путь: «img», причина: null } }, _message: «Проверка изображения не удалась» } 11.10.2020
  • Ладно, круто, прогресс. Итак, теперь осталось просто передать поток в MongoDB. В ответе, на который я ссылался выше, я заметил, что есть и другие примеры, использующие fs.readFile вместо fs.createWriteStream. Можешь попробовать? Цель состоит в том, чтобы получить данные в массив байтов для сохранения в MongoDB. Стоит отметить, что я не очень хорошо знаком с функциональностью fs, поэтому сейчас я просто указываю на другие примеры. 11.10.2020
  • Получение этой ошибки после перехода на fs.readFile: UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_CALLBACK]: обратный вызов должен быть функцией 11.10.2020
  • Продолжайте в том же духе, я думаю, вы приближаетесь, просто нужно потратить немного больше времени на детали и сообщение об ошибке. Опять же, на данном этапе мне трудно помочь, потому что я не вижу изменений в вашем коде, а также не знаком с fs. Но вы также должны попытаться отладить эту ошибку. Одна вещь, которую я заметил, заключается в том, что в ответе, на который я ссылался, они сначала сохраняли данные изображения локально, прежде чем они могли использовать для него readFile (это не исходит из URL-адреса таким образом). Но ошибка, которую вы получаете, не совсем связана с этим. 11.10.2020
  • Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

    Почему объяснимость так важна прямо сейчас?
    По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..