在 MERN 应用中实施后台作业的最佳方法是什么?

问题描述

我制作了一个小型 MERN 应用程序,用户可以在其中上传图片,为此我使用了 multer。虽然它在开发中运行良好,但在部署到 heroku 后,每次我尝试上传图像时,都会收到 code=H12(Request timeout) 错误,并表示请求加载时间超过 3 秒。经过一番挖掘,我发现在给出此错误之前,heroku 的响应请求的时间限制为 3000 毫秒。 唯一的解决方案是将图片上传实现为后台作业,但我什至不知道从何开始,因为我以前从未这样做过。

实现图片上传作为后台作业的最佳方式是什么?任何建议或教程链接都会非常有帮助和赞赏。

图片上传路径文件

const router = require('express').Router();
const multer = require('multer');
const FILE_PATH = 'uploads';

const { uploadPhoto } = require('../controllers/photos/upload-photo');

const storage = multer.diskStorage({
    destination: (req,file,cb) => cb(null,FILE_PATH),filename: (req,cb) => {
        cb(null,`${Date.Now()}_${file.originalname}`)
    },fileFilter: (req,cb) => {
        if (!file.originalname.match(/\.(jpeg|jpg|png|JPG|PNG)$/)) {
            console.log('Only upload jpg and png files.');
        }

        cb(undefined,true);
    },});

router.post('/upload/:userid',multer({ storage }).single('photo'),uploadPhoto);

module.exports = router;

图片上传的控制器文件

const User = require('../../models/User');
const Photo = require('../../models/Photo');

exports.uploadPhoto = (req,res) => {
    //My approach with Multer

    const { file: { mimetype,filename,path },protocol } = req;
    const url = `${protocol}://${req.get('host')}`;

    User
        .findById(req.params.userid)
        .exec((error,user) => {
            if (error || !user) return res.status(404).json({ message: error.message,});

            const newPhoto = new Photo({
                photo: {
                    mimetype,photoUrl: `${url}/${path}`,name: filename,},owner: user._id,});

            newPhoto.save((error,photo) => {
                if (error) {
                    return res.status(404).json({ message: error.message,});
                }

                user.photos.push(newPhoto._id);
                user.save();

                return res.status(201).json({
                    message: `Image created`,photoUrl: photo.photoUrl,});
            });
        });
};

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...