Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将图像从url保存到nodejs中的db_Javascript_Node.js_Mongodb - Fatal编程技术网

Javascript 将图像从url保存到nodejs中的db

Javascript 将图像从url保存到nodejs中的db,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我对nodejs比较陌生。我正在尝试保存url中提供的图像(来自api)。经过一些在线研究,我决定使用nodejs中的createWriteStream方法从url中提取图像并保存到本地目录中。但我希望能够直接保存到mongodb。我不知道如何在mongodb中将目标更改为集合 我的代码片段如下所示: const fs=require('fs'); const request=require('request'); const Image=require(“./models/Image”);

我对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();
常量ext='jpg';
常量url=https://some_path_for_image_by_api';
const getData=async(u,cb)=>{
const myImage=等待请求(url).pipe(
fs.createWriteStream(`${imageName}.${ext}`)
);
cb(myImage);
};
const saveData=async(d)=>{
const image=等待新映像(d);
image.save(函数(错误、数据){
if(err)返回控制台。error(err);
else返回console.log('Image saved successfully',data);
});
};

getData(url,saveData)
看起来模型中唯一的字段是
createdAt
,因此图像数据本身不会被保存。为了保存图像数据,需要向模型中添加适当的字段

来自Mongoose文档:

strict选项(默认情况下启用)确保传递给模型构造函数的、未在模式中指定的值不会保存到数据库中

自发布架构后编辑:请尝试此操作

const ImageSchema = new mongoose.Schema({
  createdAt: {
    type: Date,
    default: Date.now(),
  },
  img: {
    type: Buffer
  }
});
然后,需要在模型中按名称设置该字段。比如:

const image = new Image({ img: d });
其中字段名为
缓冲区

我不熟悉
fs
,因此在这方面我帮不了什么忙,但这假设
d
包含一个字节数组。如果它目前不是一个字节数组,我想下一步将把它转换成一个字节数组,这样它就可以保存到MongoDB中。这个答案可能有助于这一部分:


这是否回答了您的问题?你能分享你的图像模型代码吗?@MattM,
const mongoose=require('mongoose');const ImageSchema=new mongoose.Schema({createdAt:{type:Date,默认值:Date.now,},});module.exports=mongoose.model('Image',ImageSchema)@KunalMukherjee,不太清楚。不过谢谢你。即使在模式中添加一个字段作为{image:{type:Buffer}},当我触发函数时,如何保存到数据库中?目前,仅添加该字段并没有将该图像保存到数据库中。您能否更新问题中的代码以反映此更改?否则我不能确定到底发生了什么。对于当前代码,仍然需要将模型上的字段设置为图像缓冲区。我不确定你是否已经这么做了。我将更新我的答案,使之更加明确。只是用图像模式更新了代码,并对问题进行了进一步澄清。看起来不错。我认为你还需要稍微改变一下型号。尝试
img:Buffer
。我会再次更新我的答案。编辑:我注意到createdAt的默认值可能由于缺少括号而设置不正确。我也在我的建议中加入了这些。这至少可以修复
createdAt
未填充的问题。获取以下内容:{img:{CastError:Cast to Buffer失败,因为值“WriteStream”{……|消息格式:未定义,种类:'Buffer',值:[WriteStream],路径:'img',原因:null},{u消息:'Image validation failed'}