我对nodejs比较陌生。我正在尝试保存一个url中提供的图像(从api)。经过一些在线研究,我决定使用nodejs的createWriteStream方法从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);
下面是我的Image模式定义:
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,而不会将任何内容保存到根目录。也许我做得不对。如何将其保存到数据库中,而不是保存到目录中的某些文件夹或根目录?任何帮助和建议都将不胜感激。
发布于 2020-10-11 03:47:46
看起来模型中唯一的字段是createdAt,所以图像数据本身不会被保存。为了保存图像数据,您需要向模型中添加适当的字段。
来自Mongoose文档:
选项(默认情况下启用)可以确保传递给模型构造函数的值不会保存到数据库中,这些值没有在模式中指定。
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/questions/64294562
复制相似问题