【问题标题】:What is the correct way to make multer work with Node and Express here?在这里让 multer 与 Node 和 Express 一起工作的正确方法是什么?
【发布时间】:2021-08-14 06:27:49
【问题描述】:

我正在尝试创建可以上传照片的路线。但是,当我这样做时,e 更改它停止工作,我不知道如何使它工作。

const multer = require('multer');

// MULTER STORAGE
const multerStorage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, '/upload');
  },
  filename: (req, file, cb) => {
    const ext = file.mimetype.split('/')[1];
    // Saving format: user-UserId-DateStamp.ext
    //e.g user-608d55c7e512b74ee00791de-1621992912638.jpeg
    cb(null, `user-${req.body.userId}-${Date.now()}.${ext}`);
  },
});

//MULTER FILTER
const multerFilter = (req, file, cb) => {
  //mimetype always starts with image/ then png or jpeg or..
  if (file.mimetype.startsWith('image')) {
    cb(null, true);
  } else {
    cb(new AppError('You are only allowed to upload image files.', 400), false);
  }
};

const uploadDirectory = multer({
  storage: multerStorage,
  fileFilter: multerFilter,
});

//exports.uploadPhoto = uploadDirectory.single('photo');

//app.use(express.static('./uploads'));

// INCLUDE ERROR CLASS AND ERROR CONTROLLER
const AppError = require('../utils/appError.js');
const errorController = require('./errorController.js');
const { Mongoose } = require('mongoose');

我猜的主要问题在这个区块

//UPLOAD PHOTO
exports.uploadPhoto = uploadDirectory(async (req, res) => {
  console.log(req.body);
  console.log(req.file);

  try {
    const newPhoto = await photoModel.create(req.file);
    newPhoto.save().then((result) => {
      console.log('Saved');
      res.status(201).json({
        status: 'success',
        // data: JSON.parse(JSON.stringify(newPhoto.file)),
      });
    });
  } catch (err) {
    console.log('Error in upload');
    errorController.sendError(err, req, res);
  }
}).single('photo');

谁能告诉我如何正确编写exports.uploadPhoto

原来最后一个函数是这样的

exports.uploadPhoto = async (req, res) => {
  console.log(req.body);
  console.log(req.file);

  try {
    const newPhoto = await photoModel.create(req.file);
    newPhoto.save().then((result) => {
      console.log('Saved');
      res.status(201).json({
        status: 'success',
        // data: JSON.parse(JSON.stringify(newPhoto.file)),
      });
    });
  } catch (err) {
    console.log('Error in upload');
    errorController.sendError(err, req, res);
  }
};

【问题讨论】:

    标签: javascript node.js express multer


    【解决方案1】:

    multer 中间件功能,在您的情况下为 uploadDirectory,通常在您拥有业务逻辑的其他中间件功能/控制器之前使用(例如 uploadPhoto)。

    app.post('/upload', uploadDirectory.single('photo'), uploadPhoto);
    

    保留您原来的uploadPhoto 函数,使用上面的代码,您将可以分别通过reg.bodyreq.file 访问数据和文件。

    这个Request Parsing in Node.js Guide(它是免费的)将帮助您在 Node.js 中上传文件。

    【讨论】:

    • 我这样做了,现在我实际上可以保存到我的数据库中,但是我的照片不再保存在我的本地目录中
    • 尝试将目的地从/upload更改为upload,看看是否有效。第一个可能保存在您的笔记本电脑/服务器的根目录下,第二个保存在您项目的根目录下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2010-11-06
    • 2014-11-30
    • 2021-12-02
    • 2017-01-16
    • 1970-01-01
    相关资源
    最近更新 更多