简体   繁体   English

Nodejs MongoDB - 添加新条目 Post()

[英]Nodejs MongoDB - add new entry Post()

so trying to post new entry into MongoDB. but getting this error in Redux Product validation failed: name: Path 'name' is required., description: Path 'description' is required.因此尝试将新条目发布到 MongoDB。但在 Redux 中出现此错误Product validation failed: name: Path 'name' is required., description: Path 'description' is required.

nodejs version: 14.9.0 and Atlas mongodb. nodejs 版本:14.9.0 和 Atlas mongodb。

frontEnd addProduct.js page:前端addProduct.js页面:

import { createProduct } from '../redux/actions/productActions'

const [name, setName] = useState('')
const [description, setDescription] = useState('')


const createProductHandler = (e) => {
    e.preventDefault()
    dispatch(createProduct({
        name,
        description
    }))
}

 const nameHandler = (e) => {
    setName(e.target.value)
}

const descriptionHandler = (e) => {
    setDescription(e.target.value)
}

return (
  <input type='text' onChange={nameHandler} />
  <input type='text' onChange={descriptionHandler} />
  <input type="submit" value='submit' onClick={createProductHandler} />
)

productController:产品控制器:

const createdProduct = asyncHandler(async (req, res) => {
  const mongoProduct = async (data) => {
    return new Product({
        name: data.name,
        description: data.description
    })
  }

 const product = await mongoProduct(req.body)

 const createdProduct = await product.save()

 res.status(201).json(createdProduct)
})

productActions:产品操作:

export const createProduct = () => async (dispatch, getState) => {
try {
    dispatch({
        type: 'PRODUCT_CREATE_REQUEST',
    })

    const {
        userLogin: {userInfo},
    } = getState()

    const config = {
        headers: {
            Authorization: `Bearer ${userInfo.token}`,
        },
    }

    const { data } =  await axios.post(`/api/products`, {}, config)

    dispatch({
        type: 'PRODUCT_CREATE_SUCCESS',
        payload: data
    })
} catch (error) {
    dispatch({
        type: 'PRODUCT_CREATE_FAIL',
        payload:
            error.response && error.response.data.message
                ? error.response.data.message
                : error.meessage,
    })
 }
} 

productReducers.js: productReducers.js:

export const productCreateReducer = (state = {}, action) => {
switch (action.type) {
    case 'PRODUCT_CREATE_REQUEST':
        return {loading: true}
    case 'PRODUCT_CREATE_SUCCESS':
        return {loading: false, success: true, product: action.payload}
    case 'PRODUCT_CREATE_FAIL':
        return {loading: false, error: action.payload}
    default: 
        return state
 }
}

alternatively when i try to populate the database from post-man using this code in productController.js it works fine with sample data:或者,当我尝试使用 productController.js 中的此代码从邮递员填充数据库时,它可以很好地处理示例数据:

const createdProduct = asyncHandler(async (req, res) => {
 const product = new Product({
    name: 'Sample Name',
    description: 'Sample Description'
 })

 const createdProduct = await product.save()
 res.status(201).json(createdProduct)
})

plus im getting POST ipadress/api/products 500 (Internal Server Error) in console加上我在控制台中获取POST ipadress/api/products 500 (Internal Server Error)

You can config your axios api service config to separate file and use axios您可以将axios api 服务配置配置为分隔文件并使用axios

const request = axios.create({
  // baseURL: 'https://mock-api.com',
  baseURL: BASE_URL ,
  timeout: 5000
})

request.interceptors.request.use(
  config => {
    // get token
    if (// check your token) {
      config.headers["Authorization"] = "Bearer ${your-token}"
    }
    return config
  },
  error => {
    // Do something with request error
    console.log(error) // for debug
    Promise.reject(error)
  }
)

// Can also config axios response interceptors to handle API error

Your redux action你的redux动作

import axiosInstance from './your-axios-config-path'

export const createProduct = (product) => async (dispatch, _getState) => {
  try {
    dispatch({ type: 'PRODUCT_CREATE_REQUEST' })
    const response = await axiosInstance.post(`/api/products`, {...product})
    dispatch({
      type: 'PRODUCT_CREATE_SUCCESS',
      payload: response?.data ?? {}
    })
  } catch (error) {
    dispatch({
      type: 'PRODUCT_CREATE_FAIL',
      payload: // error message,
    })
  }
}

Alternatively, you can useRedux Toolkit , It much easier to setup store and using.或者,您可以使用Redux 工具包,它更容易设置商店和使用。 It includes createAsyncThunk , RTK Query to handle side effect.它包括createAsyncThunkRTK 查询来处理副作用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM