[Javascript - Nodejs - Mongoose] Problème Fetch PUT form-data

Problème Fetch PUT form-data [Javascript - Nodejs - Mongoose] - Javascript/Node.js - Programmation

Marsh Posté le 28-10-2022 à 20:12:29    

Je serre. Mon problème alors. Je fais une requête Fetch pour mettre à jour ma base de données se trouvant chez MongoDB, cela fonctionne parfaitement en Content-Type: application/json, mais pas lorsque je veux utiliser FormData() pour l'envoi ensuite d'images.
 
Mon code côté front (React) :  
 

Code :
  1. function ModalPageMyProfile() {
  2.   const authContext = useContext(AuthContext)
  3.   const [dataResult, setDataResult] = useState({})
  4.         const regexFormChangeFirstName = (e) => {
  5.          
  6.           const newDataResult = {...dataResult}
  7.           newDataResult.firstname = e.target.value
  8.           setDataResult(newDataResult)
  9.          
  10.         RegexFunctionChange.infoInvisible('#signUpFirstName', '#alertInfoFirstName', '#alertInfoArrowFirstName', 'alertInfoMinLetterInvisible', 'alertInfoFirstNameMinLetterVisibleModalMyProfile',
  11.             'alertInfoArrowInvisible', 'alertInfoFirstNameArrowVisibleModalMyProfile')   
  12.         RegexFunctionChange.firstName('#signUpFirstName')
  13.             // if (e.target.value.match(/^[a-zA-Z-]{2,25}$/)) {
  14.             // valueFirstName = e.target.value  
  15.             // console.log(valueFirstName)     
  16.             // }  
  17.             // else {
  18.             // valueFirstName = null
  19.             // }
  20.         }
  21.        
  22.         const regexFormChangeLastName = (e) => {
  23.          
  24.           const newDataResult = {...dataResult}
  25.           newDataResult.lastname = e.target.value
  26.           setDataResult(newDataResult)
  27.          
  28.        
  29.             RegexFunctionChange.infoInvisible('#signUpLastName', '#alertInfoLastName', '#alertInfoArrowLastName', 'alertInfoMinLetterInvisible', 'alertInfoLastNameMinLetterVisibleModalMyProfile',
  30.                 'alertInfoArrowInvisible', 'alertInfoLastNameArrowVisibleModalMyProfile')   
  31.             RegexFunctionChange.lastName('#signUpLastName')
  32.        
  33.        
  34.             // if (e.target.value.match(/^[a-zA-Z-]{2,25}$/)) {
  35.             // valueLastName = e.target.value   
  36.             // }  
  37.             // else {
  38.             // valueLastName = null
  39.             //}
  40.         }
  41. const formData = new FormData()
  42. const dataObject = {...dataResult}
  43. formData.append('infosUser', JSON.stringify(dataObject))
  44. //formData.append('Authorization', `Bearer ${authContext.token}`)
  45. console.log(formData.get('infosUser'))
  46. const fetchPut = () => {
  47.   if (dataResult.firstname.match(/^[a-zA-Z-]{2,25}$/) &&
  48.       dataResult.lastname.match(/^[a-zA-Z-]{2,25}$/)) {
  49.     // const fetchHandlerUpdate = async () => {
  50.     //   const response = await  
  51.       fetch(urlPut,
  52.         {
  53.           method: 'PUT',
  54.           headers: {
  55.             //'Content-Type': 'application/json',
  56.             'Accept': 'application/json',
  57.             'Authorization': `Bearer ${authContext.token}`
  58.           },
  59.           body: formData
  60.           })
  61.           .then( response => response.json())
  62.           .then ( data => console.log(data))
  63.           // const data = await response.json( );
  64.           // if(response.ok) {
  65.           //   console.log(data)
  66.           // }
  67.          
  68.     } 
  69.   //   fetchHandlerUpdate()
  70.   // }
  71. }
  72.   return (
  73.         <DivNameProfile>
  74.         <DivNameInput>
  75.          
  76.         <input name={'firstName'} placeholder={dataResult.firstname} value={dataResult.firstname || ' '} id={'signUpFirstName'} className={'inputsNameMyProfile input'} onBlur={regexBlurFirstName} onChange={regexFormChangeFirstName}></input>
  77.        
  78.         </DivNameInput>
  79.         <DivNameInput>
  80.        
  81.         <input name={'lastName'} placeholder={dataResult.lastname} value={dataResult.lastname || ' '} id={'signUpLastName'} className={'inputsNameMyProfile input'}  /*onFocus={() => test()}*/ onBlur={regexBlurLastName} onChange={regexFormChangeLastName}></input>
  82.        
  83.         </DivNameInput>
  84.         </DivNameProfile>
  85. <ButtonValidation onClick={() => fetchPut()}/>
  86. )
  87. }


 
 
Rendus console côté front (le state se met à jour nickel :

Code :
  1. {"_id":"6357f144a5ac260a67a5a9c9","firstname":"Jzaaaeeedd","lastname":"Jza","email":"jerome@truc.fr","password":"$2b$10$LY7dWK65f9Xs1PKD8Oy.c./OJZy1rPfNturFRGlaYQW0hzelNK0FS","bioProfile":"","city":"","imageUrlProfilePicture":"","imageUrlLandscapePicture":"","admin":false,"__v":0}
  2. {message: 'Objet modifié !'}


 
 
Middleware côté back :  

Code :
  1. exports.modifyInfosUser = (req, res) => {
  2.     const userObject = req.file ? {
  3.         ...JSON.parse(req.body.infosUser),
  4.         imageUrlProfilePicture: `${req.protocol}://${req.get('host')}/images/${req.file.filename}`
  5.     } : { ...req.body };
  6.     console.log(req.body.infosUser)
  7.     delete userObject.userId;
  8.     User.findOne({ _id: req.params.id})
  9.     .then((user) => {
  10.         if ( user._id != req.auth.userId) {
  11.             res.status(401).json({ message:'Non-autorisé' })
  12.         } else {
  13.             User.updateOne({ _id: req.params.id }, { ...userObject, _id: req.params.id }, {returnNewDocument: true}/*, {returnOriginal:false}*/)
  14.             .then(() => res.status(200).json({ message: 'Objet modifié !' }))
  15.             .catch((error) => res.status(403).json({ error }));
  16.             console.log(req.body)
  17.         }
  18.     })
  19.     .catch((error) => res.status(400).json({ error }))
  20. }


 
Rendus console côté back :  

Code :
  1. {
  2.   userId: '6357f144a5ac260a67a5a9c9',
  3.   iat: 1666973805,
  4.   exp: 1667002605
  5. }
  6. {"_id":"6357f144a5ac260a67a5a9c9","firstname":"Jzaaaeeedd","lastname":"Jza","email":"jerome@truc.fr","password":"$2b$10$LY7dWK65f9Xs1PKD8Oy.c./OJZy1rPfNturFRGlaYQW0hzelNK0FS","bioProfile":"","city":"","imageUrlProfilePicture":"","imageUrlLandscapePicture":"","admin":false,"__v":0}


 
 
Et mes CORS :  

Code :
  1. app.use((req, res, next) => {
  2.     // res.setHeader('Access-Control-Allow-Origin', '*');
  3.     // res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content, Accept, Content-Type, Authorization');
  4.     // res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');
  5.     res.header("Access-Control-Allow-Origin", "*" );   
  6.     res.header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS');
  7.     res.header("Access-Control-Allow-Headers", "X-Requested-With, X-HTTP-Methods-Override, Content-Type, Accept,Cache-Control, Pragma, Origin, Authorization, Content-Type, form-data" );
  8.     res.header("Access-Control-Allow-Credentials", "true" );
  9. if ('OPTIONS' == req.method){
  10.     return res.send(200);
  11. }
  12.     next();
  13. });
  14. app.use(express.json());
  15. app.use('/', usersRoutes)
  16. app.use('/images', express.static(path.join(__dirname, 'images')));
  17. app.use(express.urlencoded({ extended: true }));
  18. module.exports = app;


 
Voilà, plus de deux jours sur ça comme un noob, en faisant recherche sur recherche, test sur test, sans trouver l'origine du truc.
 
Toute aide est plus que la bienvenue

Reply

Marsh Posté le 28-10-2022 à 20:12:29   

Reply

Marsh Posté le 28-10-2022 à 23:09:45    

Pour les images, faudrait pas mettre "multipart/form-data" plutôt que application/json ?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 29-10-2022 à 00:14:35    

Tout à fait, de ce que j'ai compris du moins. Faut juste pas marqué "Content-Type": "application/json", ça le fait automatique. Je cherche encore sans rien comprendre.

Reply

Marsh Posté le 01-11-2022 à 15:10:23    

Problème résolu. Je donne la solution plus tard pour qui pourrait avoir besoin, pas trop le temps là.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed