0

I built a register used Multer to upload image to cloudinary and used an API to frontend, When i'm submit console displays MulterError: Unexpected field when I tested on Postman it work, I guess the problem is about API.

//front-end

    const handleRegister = async (event) => {
    event.preventDefault();
    const data = new FormData(formRef.current);
    if (selectedFile) {
      data.append("image", selectedFile);
    }
    try {
      await register(data);
    } catch (error) {
      console.error(error);
    }
  };
  
  const handleFileChange = (event) => {
    setSelectedFile(event.target.files[0]);
  };

 <input
   name="image"
   hidden
   accept="image"
   type="file"
   placeholder="Select file"
   onChange={handleFileChange}           
     />

//Api.js

import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";

export const api = createApi({
    baseQuery: fetchBaseQuery({ baseUrl: process.env.REACT_APP_BASE_URL }),
    reducerPath: "adminApi",
    tagTypes: [ "Auth"
    ],

    endpoints: (build) => ({
      register: build.mutation({
        query: (formData) => ({
          url: "/auth/register",
          method: "POST",
          body: formData,
        }),
      }),
      login: build.mutation({
        query: ({ email, password }) => ({
          url: 'auth/login',
          method: 'POST',
          body: { email, password },
        }),
    }),
});

export const { useRegisterMutation, useLoginMutation } = api;

//routes.js

import express from "express";
import { login, register, uploadImage} from "../controller/authController.js";
import { parser } from "../config.js";

const router = express.Router();

router.post("/upload", parser.single("image"), uploadImage);
router.post("/register", parser.single("image"), register);
router.post("/login", login);

export default router;

//Controller.js

import Admin from "../models/admin.js"
import bcrypt from "bcrypt";
import jwt from "jsonwebtoken";
import { parser } from "../config.js";


export const register = async (req, res) => {
  try {
    const { firstname, lastname, password, email, type, public_id } = req.body;

    // Check if the user already exists
    const existingUser = await Admin.findOne({ email });
    if (existingUser) {
      return res.status(400).json({ message: "User already exists" });
    }

    const newUser = new Admin({
        firstname,
        lastname,
        password,
        email,
        role: type,
        public_id: req.file.path,
      });

    await newUser.save();

    res.status(201).json(newUser);
  } catch (error) {
    res.status(500).json({ message: "Something went wrong", error: error.message });
  }
};

export const uploadImage = async (req, res) => {
  try {
    if (!req.file) {
      return res.status(400).json({ message: "No image file provided" });
    }

    const image = req.file;

    res.status(201).json({ image });
  } catch (error) {
    res.status(500).json({ message: "Something went wrong" });
  }
};

//config.js

import cloudinary from "cloudinary";
import { CloudinaryStorage } from "multer-storage-cloudinary";
import multer from "multer";

cloudinary.v2.config({
  cloud_name: process.env.CLOUDINARY_CLOUD_NAME,
  api_key: process.env.CLOUDINARY_API_KEY,
  api_secret: process.env.CLOUDINARY_API_SECRET,
});

const storage = new CloudinaryStorage({
  cloudinary: cloudinary.v2,
  params: {
    folder: "test1",
    format: async (req, file) => 'jpg', // supports promises as well
  },
});

const fileFilter = (req, file, cb) => {
  const allowedTypes = ["image/jpeg", "image/jpg", "image/png"];

  if (!allowedTypes.includes(file.mimetype)) {
    const error = new Error("Incorrect file type");
    error.code = "INCORRECT_FILETYPE";
    return cb(error, false);
  }
  cb(null, true);
}

export const parser = multer({ storage: storage, fileFilter: fileFilter });

this is my code what's wrong, how can I fix it?

CODINE
  • 1
  • 2
  • I think you need to show us your front-end submit form code. the `` element should look like: `` notice that the `name` attribute value should be the same as what you pass inside `parser.single("image")` function which is `"image"`. reference [here](https://stackoverflow.com/q/31530200/10811003) – Khairani F May 28 '23 at 06:09
  • I already add front-end code – CODINE Jun 01 '23 at 09:28

0 Answers0