node.js - 如何使用 nodejs、express、mongodb 存储图像并做出反应
问题描述
我正在尝试使用 node 和 mongodb 存储图像。我在前端使用 react。我尝试使用 multer,但它给出错误说“TypeError:路径必须是字符串或缓冲区”。有没有其他方法来存储图像使用节点和 mongodb
//server.js
const multer = require("multer");
const storage = multer.diskStorage({
destination: function (req, res, cb) {
cb(null, 'uploads/')
}
});
const upload = multer({
storage: storage
});
router.route('/imageCard/add').post(upload.single('file'), function (req, res)
{
let imageDetails=new ImageCard();
imageDetails.name=req.body.name;
imageDetails.imgSource= fs.readFileSync(req.body.imgSource);
imageDetails.price=req.body.price;
imageDetails.size=req.body.size;
imageDetails.save().then(details=>
{
res.status(200).json('Added');
}).catch(err=>{
result.status(400).send('Failed to Add');
})
});
//(model )
import mongoose from 'mongoose';
const Schema = mongoose.Schema;
let imageCard=new Schema({
name:{
type:String
},
imgSource:{
type:Buffer
},
size:{
type:String
},
price:{
type:String
}
});
export default mongoose.model('ImageCard', imageCard);
//react file
onChange(e) {
this.state.file = e.target.files[0];
}
onsubmit() {
console.log('on submit');
const newDoc = {
name: document.getElementById('name').value,
price: document.getElementById('price').value,
size: document.getElementById('size').value,
imgSource:this.state.file
}
console.log(newDoc.imgSource);
axios.post(`http://localhost:4000/imageCard/add`,newDoc).then(res=>{
console.log(res.data);
}).catch(err=>{
console.log(err);
});
}
如果我使用下面的代码,那么它会给出这个错误: TypeError: Cannot read property 'path' of undefined
imageDetails.imgSource= fs.readFileSync(req.file.path);
我没有在 server.js 文件中接收 imgSource 值,它显示空值。
解决方案
就在几天前,我遇到了同样的问题。最后我通过这样做来实现它:
const multer = require('multer');
const path = require('path');
const upload = multer({
storage: multer.diskStorage({
destination: (req, file, callback) => {
try {
let path = "What ever your path is";
fs.mkdirsSync(path);
callback(null, path);
}catch (e) {
callback(jsonError(e),null)
}
},
filename: (req, file, callback) => {
//original name is the uploaded file's name with ext
callback(null, mongoose.Types.ObjectId()+path.extname(file.originalname));
}
})
});
然后在您的路线中制作您的 uoload.whatever。请注意,一旦 multer 工作,您将拥有一个新的 req.file 或 req.files,其中包含名称、大小等
推荐阅读
- android - 拦截 crashlytics 隐私对话框按钮单击
- vue.js - 如何将 Vuetify 2.0 添加到现有项目中?
- python - 如何从 Mountain Car 的自定义初始状态启动环境?
- ios - 变换是否会导致 UIView 的框架未定义?
- reactjs - 新的 React Hooks 困惑
- python - 找到数组中最大的最频繁数
- apache-spark - Spark - 有没有办法清理孤立的 RDD 文件和块管理器文件夹(使用 pyspark)?
- python-3.x - wxPython pdfviewer 未知字体阻止 pdf 加载
- azure - webapps 是否与 Azure 上的现有 VM 集成?
- ios - 基于屏幕高度的约束常数