Я относительно новичок в 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 в виде документа, ничего не сохраняя в корневом каталоге. Может быть, я не делаю правильный путь. Как сохранить его в БД, а не в некоторые папки в каталоге или в корневом каталоге? Любая помощь и предложение будут высоко оценены.
img: Buffer
. Я снова обновлю свой ответ. Изменить: я заметил, что значение по умолчанию для createdAt могло быть установлено неправильно из-за отсутствия скобок. Я тоже добавил их к своему предложению. Это должно по крайней мере исправить, чтоcreatedAt
не заполняется. 11.10.2020fs
, поэтому сейчас я просто указываю на другие примеры. 11.10.2020fs
. Но вы также должны попытаться отладить эту ошибку. Одна вещь, которую я заметил, заключается в том, что в ответе, на который я ссылался, они сначала сохраняли данные изображения локально, прежде чем они могли использовать для него readFile (это не исходит из URL-адреса таким образом). Но ошибка, которую вы получаете, не совсем связана с этим. 11.10.2020