如果没有上传图像,如何将默认图像放入 multer?

Posted

技术标签:

【中文标题】如果没有上传图像,如何将默认图像放入 multer?【英文标题】:How can you put a default image in multer if no image is uploaded? 【发布时间】:2021-10-23 22:59:34 【问题描述】:

我正在尝试设置 multer,但图像出现了一些问题,目前,当我不上传任何图像时,服务器会给我一个错误,不允许我继续。我希望即使图像未上传,仍将值存储在数据库中。

这是我配置 multer 的地方:

    const express = require('express');
    const router = express.Router();
    const multer  = require('multer');
    
    const Clients = require('../models/clients.js')
    
    const storage = multer.diskStorage(
      destination: (req, file, callback) => 
        callback(null, "../emaildragger/public/uploads")
      ,
      filename: (req, file, callback) => 
        callback(null, file.originalname)
      
    )
    
    const upload = multer(storage: storage)
    
    router.route('/').get((req, res) => 
        Clients.find()
        .then(client => res.json(client))
        .catch(err => res.status(400).json('Error:' + err))
    )
    
    router.route('/:id').get((req, res) => 
      Clients.findById(req.params.id)
      .then(client => res.json(client))
      .catch(err => res.status(400).json("Error" + err))
    )
    
    router.route('/add').post(upload.single("image"), (req, res) => 
      
        const newClient = new Clients(
          image: req.file.originalname,
          firstName: req.body.firstName,
          lastName: req.body.lastName,
          weight: req.body.weight,
          BMI: req.body.BMI
        )
    
        newClient.save()
        .then (() => res.json(newClient))
        .catch(err => res.status(400).json('error' + err))
    )
    
    module.exports = router

这是我的模型:

    var mongoose = require('mongoose');
    
    var Schema = mongoose.Schema;
    
    var clientsSchema = new Schema(
      
        image: 
           type: String, required: false, default: 'Screenshot_293.png',
        firstName:  type: String, required: true ,
        lastName:  type: String, required: true ,
        weight:  type: String, required: false ,
        BMI:  type: String, required: false 
      
    );
    
    
    const Clients = mongoose.model("clients", clientsSchema)
    
    
    module.exports = Clients

【问题讨论】:

你能把错误添加到问题中吗? 没有错误,只是没有任何反应 但是你有问题说服务器给你一个错误,不允许你继续。 POST http://localhost:4000/clients/add 500 (Internal Server Error) 这是错误 【参考方案1】:

错误出现在您的服务器中,因为您添加了Multer 作为中间件,稍后在您的控制器中您尝试访问上传文件的originalname。如果您没有发送图片,那么Multer 将不会解析并上传,文件将不存在。在这种情况下,您将尝试访问不存在的东西的 originalname 属性,因此您的服务器将抛出错误。

尝试像这样更改您的代码:

router.route('/add').post(upload.single("image"), (req, res) => 

   let client = 
      firstName: req.body.firstName,
      lastName: req.body.lastName,
      weight: req.body.weight,
      BMI: req.body.BMI
     
   if(req.file && req.file.originalname) client.image = req.file.originalname;
   
   const newClient = new Clients(client)

   newClient.save()
   .then (() => res.json(newClient))
   .catch(err => res.status(400).json('error' + err))
)

【讨论】:

以上是关于如果没有上传图像,如何将默认图像放入 multer?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 multer 模块将图像上传到 mongodb

如何使用 multer 和 NodeJS 将图像上传到 GCS 存储桶?

如何在节点中使用 multer 将图像上传到 cloudinary 并与其他数据一起表达

如何在nodejs中使用sharp调整图像大小然后使用multer上传

如何在nodejs中使用sharp调整图像大小然后使用multer上传

MongoDB & Multer - 如何将缓冲区二进制文件转换为图像?