在使用multer上传文件之前验证请求正文

时间:2018-09-19 17:23:17

标签: javascript node.js express multer

我目前正在使用nodejs开发API。我希望用户上传文件以及其他必需的详细信息。但是问题是,在我能够验证用户通过的必需详细信息之前,multer已上传文件。是否只有在验证了req.body值之后才可以上传文件?

我当前的代码:

router.post("/", upload.single("gallery_item_image"), function (req, res, next) {
    Branch
        .findById({ _id: req.body.branch_id })
        .exec()
        .then((doc) => {
            if(!doc || req.body.branch_id.length < 24) {
                return res.status(404).json({
                    message: "Invalid Branch ID",
                })
            }
            galleryItem = new GalleryItem({
                _id: mongoose.Types.ObjectId(),
                branch_id: req.body.branch_id,
                caption: req.body.caption,
                description: req.body.description,
                absoluteImagePath: req.file.path,
                imagePath: "some.url"
            })
            return galleryItem.save()
        })
        .then((response) => {
                console.log(response);
                res.status(201).json({
                    message: "Gallery item successfully added to the database",
                    galleryItem: {
                        _id: response._id, 
                        branch_id: response.branch_id, 
                        imagePath: response.imagePath.replace("\\", "/"),
                        caption: response.caption, 
                        description: response.description, 
                        date: response.date,
                        absoluteImagePath: response.absoluteImagePath,
                        meta: {
                            type: "GET", 
                            url: "some.url",
                        }
                    }
                })
            })
        .catch((error) => {
            console.log(error);
            res.status(500).json({
                error: error
            })
        })
})

2 个答案:

答案 0 :(得分:0)

并非完全是作者的要求,但是如果您要通过JWT或类似方式验证请求,则可以在请求标头中添加身份验证数据,例如

Authorization: TOKEN_OR_ANY_AUTHETICATION_DATA

您将可以访问标头,而无需访问正文,因此可以解决您的问题。这样您就可以在中间件中使用这些数据。或上传文件之前调用的任何功能

答案 1 :(得分:-1)

我认为您可以在考虑实际的中间件之前使用中间件。类似于以下代码:

const validator = function(req, res, next) {
    // Do some validation and verification here
    if(okay)
       return next();
    else
       return res.status(400).send({message: 'Invalid Arguments(For Example!)'})
}

并在上载之前将此功能用作中间件,如下所示:

router.post("/", validator, upload.single("gallery_item_image"), function (req, res, next) {
    // Your code goes here
}

希望对您有帮助。