Как я могу опубликовать массив объектов с formData, если я использую ax ios для публикации данных? - PullRequest
0 голосов
/ 16 апреля 2020

            const formData = new FormData()
            const my_ingredients = new Array()
            const my_instructions = new Array()

            my_ingredients.push({name:formState.inputs.iName.value,amount:parseFloat(formState.inputs.amount.value),measure:formState.inputs.measure.value})
            console.log(my_ingredients)

            my_instructions.push({content:formState.inputs.content.value})

            formData.append('title',formState.inputs.title.value)
            formData.append('image',formState.inputs.image.value)
            formData.append('ingredients',JSON.stringify(my_ingredients))
            formData.append('instructions',JSON.stringify(my_instructions))
            formData.append('readyInMinutes',formState.inputs.readyInMinutes.value)
            formData.append('servings',formState.inputs.servings.value)
            formData.append('price',formState.inputs.price.value)
            formData.append('creator',auth.userId)


            const responseData = await axios.post(
                process.env.REACT_APP_BACKEND_URL+'/recipes/new',
                 formData,{
                 headers: {Authorization : `Bearer ${auth.token}`} })

В принципе, я так и делаю, но получаю 500 кодов ошибок. Я не получаю никаких ошибок токена и когда я проверяю вкладку сети на devtools. Кажется, что отправьте это, но это все еще возвращает 500 кодов ошибки.

enter image description here

модель рецепта

const mongoose = require('mongoose')
const uniqueValidator = require('mongoose-unique-validator')
mongoose.set('useCreateIndex', true);


const commentSchema = new mongoose.Schema({
  user: {
    type: mongoose.Schema.ObjectId,
    ref: 'User',
    required: true
  },
  content: {
    type: String,
    required: true,
    maxLength: 280
  }
}, {
  timestamps: true, // this adds `createdAt` and `updatedAt` properties
  toJSON: {
    // whenever the comment is converted to JSON
    transform(doc, json) {
      delete json.__v
      return json
    }
  }
})
const recipeSchema = new mongoose.Schema({
  title:{
    type:String,
    required:true
  },
  image:{
    type:String,
    required:true
  },
  ingredients:[{
    name:{
      type:String,
      required:true
    },
    amount:{
      type:Number,
      required:true
    },
    measure:{
      type:String,
      required:true
    }
  }],
  instructions:[{
    content:{
      type:String,
      required:true
    }
  }],
  readyInMinutes:{
    type:Number,
    required:true
  },
  servings:{
    type:Number,
    required:true
  },
  price:{
    type:Number,
    required:true
  },
  creator:{
    type:mongoose.Types.ObjectId,
    required:true,
    ref:'User'
  },
  ratings:[{
    point:{
      type:Number,
      required:true
    }
  }],
  comments:[commentSchema],
  nutrients:[{
    name:{
      type:String,
      required:true
    },
    amount:{
      type:Number,
      required:true
    }
  }],



})
recipeSchema.plugin(uniqueValidator)                                            //We plugin wiht mogooseValidator with our schema.
module.exports = mongoose.model('Recipe',recipeSchema)                          //We called User model with recipeSchema

контроллер рецепта

const HttpError = require('../models/HttpError')
const bcrypt = require('bcryptjs')
const jwt= require('jsonwebtoken')
const Recipe = require('../models/Recipe')
const User = require('../models/User')
const {validationResult} = require('express-validator')
const mongoose = require('mongoose')
const uuid = require('uuid/v4')
const fs = require('fs')
const path = require('path')

const getAllRecipes = async (req, res, next) => {                               //We get all recipes to show users' recipes
   let recipes
   try{
     recipes = await Recipe.find({}).exec()
   }
   catch(err){
     const error = new HttpError('Something went wrong',500)
     return next(error)
   }
   if(!recipes){
     const error = new HttpError('Could not find any recipe',404)
     return next(error)
   }

   res.status(200).json({recipes:recipes.map(recipe => recipe.toObject({getters:true}))})
}
const getRecipesByUserId = async (req, res, next) => {                          // We want to get recipes by userId, so we can show user's recipes
   const userId = req.params.uid
   let existingUser
   try{
      existingUser = await User.findById(userId).populate('recipes')
   }
   catch(err){
     const error = new HttpError('Could not find any recipes provided user id',500)
     return next(error)
   }
   if(!existingUser){                                                           // We check if this user exist or not in our database.
     const error = new HttpError('Could not find any user provided user id',404)
     return next(error)
   }
   res.status(200).json({recipes:existingUser.recipes.map(recipe => recipe.toObject({getters:true}))})
}
const createRecipe = async (req, res, next) =>{                                 //We create a new recipe
  const errors = validationResult(req)
  if(!errors.isEmpty()){
    const error = new HttpError('Invalid inputs passed, please check your data.',422)
    return next(error)
  }
  const {title,ingredients,instructions,readyInMinutes, servings, ratings,comments, nutrients,price} = req.body

  const createdRecipe = new Recipe({
    title,
    image:req.file.path,
    ingredients,
    instructions,
    readyInMinutes,
    servings,
    price,
    creator:req.userData.userId,
    ratings:[],
    comments:[],
    nutrients:[],

  })
  let user
  try{
    user = await User.findById(req.userData.userId)                             // When we add a new recipe we need user's recipes array,too.That's why We need user who add this recipe.
  }
  catch(err){
    const errors = new HttpError('Something went wrong',500)
    return next(error)
  }
  if(!user){
    const error = new HttpError('This user does not exist',422)
    return next(error)
  }
  try{                                                                          // We need to do this.Because When we add a new recipe that affect user's recipes array, too.We want to make sure to add this recipe both collections.
      const sess = await mongoose.startSession()
      sess.startTransaction()
      await  createdRecipe.save({session:sess})
      user.recipes.push(createdRecipe)
      await user.save({session:sess})
      await sess.commitTransaction()
  }
  catch(err){
    const error = new HttpError('Created recipe failed, please create again 2',500)
    return next(error)
  }
  res.status(201).json({recipe:createdRecipe})
}
const updateRecipe = async (req, res, next) => {                             
  const errors = validationResult(req)
  if(!errors.isEmpty()){
    const error = new HttpError('Invalid inputs passed, please check your data.',422)
    return next(error)
  }
  const recipeId  = req.params.rid
  let existingRecipe
  try
  {
    existingRecipe = await Recipe.findById(recipeId).populate('creator')
  }
  catch(err){
    const error = new HttpError('Something went wrong could not update place', 500)
    return next(error)
   }
   if(existingRecipe.creator.id !== req.userData.userId){                       // We want to know that creator and currentUser same person or not.
      const error = new HttpError('You are not allowed to update this recipe ',403)
      return next(error)
   }
    const {title,ingredients,instructions,readyInMinutes, servings, nutrients,price} = req.body
    existingRecipe.title = title
    existingRecipe.image = req.file.path
    existingRecipe.ingredients= ingredients
    existingRecipe.instructions = instructions
    existingRecipe.readyInMinutes = readyInMinutes
    existingRecipe.servings = servings
    existingRecipe.nutrients  = nutrients
    existingRecipe.price = price
    try{
      await existingRecipe.save()
    }
    catch(err){
      const error = new HttpError('Something went wrong could not update recipe', 500)
      return next(error)
     }
     res.status(200).json({recipe:existingRecipe.toObject({getters:true})})
}
const deleteRecipe = async (req, res, next) => {
  const recipeId = req.params.rid
  let recipe
  try{
    recipe = await Recipe.findById(recipeId).populate('creator')
  }
  catch(err){
    const error  = new HttpError('Something went wrong',500)
    return next(error)
  }
  if(!recipe){
    const error = new HttpError('This recipe does not exist',404)
    return next(error)
  }
  if(recipe.creator.id !== req.userData.userId){                                // We want to know that creator and currentUser same person or not.
    const error = new HttpError('You are not allowed to delete this recipe',403)
    return next(error)
  }
  const imagePath = recipe.image
  try{
    const sess = await mongoose.startSession()
    sess.startTransaction()
    await recipe.remove({session:sess})
    recipe.creator.recipes.pull(recipe)
    await recipe.creator.save({session:sess})
    await sess.commitTransaction()
  }
  catch(err){
    const error  = new HttpError('Something went me wrong',500)
   return next(error)
  }
  fs.unlink(imagePath, err => {
    console.log(err);
  })

     res.status(200).json({message:'Deleted recipe'})
}


exports.getAllRecipes = getAllRecipes
exports.getRecipesByUserId = getRecipesByUserId
exports.createRecipe = createRecipe
exports.updateRecipe = updateRecipe
exports.deleteRecipe = deleteRecipe

Итак, я использовал mongodb для базы данных. Когда я проверяю сервер, он не говорит явную ошибку.

...