Загрузка файла с Multer / GridFS MERN все еще показывает Fakepath при загрузке и не показывает ошибок - PullRequest
1 голос
/ 11 февраля 2020

Я впервые работаю с Multer / GridFS при использовании стека MERN. Я не вижу никаких ошибок, но по какой-то причине при загрузке изображения коллекция MongoDB по-прежнему показывает поддельный путь.

Соответствующий код с сервера. js Файл

const express = require("express");
const connectDB = require("./config/db");
const multer = require("multer");
const GridFsStorage = require("multer-gridfs-storage");
const Grid = require("gridfs-stream");
const methodOverride = require("method-override");
const path = require("path");
const crypto = require("crypto");
const bodyParser = require("body-parser");
const mongoose = require("mongoose");
const config = require("config");
const db = config.get("mongoURI");

const app = express();

// Init gfs
let gfs;

// Connect Database
connectDB("open", () => {
    // Initialize Stream
    gfs = Grid(connectDB().db, mongoose.mongo);
    gfs.collection("profiles");
});

// Create Storage Engine
const storage = new GridFsStorage({
    db: connectDB(),
    file: (req, file) => {
        return new Promise((resolve, reject) => {
            crypto.randomBytes(16, (err, buf) => {
                if (err) {
                    return reject(err);
                }
                const filename = buf.toString("hex") + path.extname(file.originalname);
                const fileInfo = {
                    filename: filename,
                    // Should Match Collection Name
                    bucketName: "profiles"
                };
                resolve(fileInfo);
            });
        });
    }
});
const upload = multer({ storage });
module.exports = upload;

Соответствующий код из файла маршрута

// @route       POST api/profile
// @description Create Or Update Current User's Profile
// @access      Private
router.post(
    "/",
    [
        auth,
        upload.single("profileImage"),
        [
            (check("archetype", "Archetype Is Required.")
                .not()
                .isEmpty(),
            check("profileImage", "Profile Picture Is Required.")
                .not()
                .isEmpty())
        ]
    ],
    async (req, res) => {
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
            return res.status(400).json({ errors: errors.array() });
        }

Соответствующий код из файла ввода формы

<form
    onSubmit={e => onSubmit(e)}
    className='form'
    enctype='multipart/form-data'
>
    <h3>Basic Profile</h3>
    <div className='grid-2'>
        <div className='form-group'>
            <label>Profile Picture</label>
            <label htmlFor='file-upload-profile' className='choose-file'>
                Upload Image File
            </label>
            <input
                name='profileImage'
                id='file-upload-profile'
                type='file'
                accept='file_extension|image/*|media_type'
                // value={profileImage}
                onChange={e => onChange(e)}
            />

MongoDB В коллекции профилей показано следующее:

profileImage:"C:\fakepath\Test Image.jpg"

Мысли

Как я уже сказал, в терминале не отображаются ошибки или консоль. Имя входного файла profileImage, которое я использую в запросе POST.

...