【问题标题】:Posting to mongoDB in react with redux/redux-thunk通过 redux/redux-thunk 发布到 mongoDB
【发布时间】:2019-09-09 21:41:31
【问题描述】:

模拟库 显示数据库中的书籍(作者标题类型)以及添加书籍的能力。

正在从我的反应组件中正确获取数据。
数据以实物形式传递给我的动作创建者,并且同样由 reducer 正确处理。
似乎我的异步 thunk 已正确设置为使用 axios 发出发布请求。我正在使用获取请求正确获取数据库中已经存在的书籍。

我的路线似乎工作正常,因为我能够正确添加一本书并使用邮递员获取所有书籍。再一次,从我的反应组件中提取我的书时,我的书正确显示。

问题出在哪里?为什么我的发帖请求没有到达我的数据库?

我的行动--

export const fetchBooks = () => dispatch => {
    axios.get('/books')
        .then(res => dispatch({
            type: FETCH_BOOKS,
            payload: res.data
        })) 
}

export const addBook = ({ title, author, genre}) => dispatch => {
    dispatch(addBookStarted())
    axios
      .post('/books', {
        title, 
        author, 
        genre
      })
      .then(res => {
        dispatch(addBookSuccess(res.data))
      })
      .catch(err => {
          dispatch(addBookFailure(err.message))
      })
}


const addBookSuccess = book => ({
    type: ADD_BOOK_SUCCESS,
    payload: {
      ...book
    }
});

const addBookStarted = () => ({
    type: ADD_BOOK_STARTED
});

我的减速机--

const initialState = {
    books: [],
    error: null,
    loadinng: false
}

export default function(state = initialState, action) {
    switch(action.type) {
        case FETCH_BOOKS:
            return {
                ...state,
                books: action.payload
            }

        case ADD_BOOK_STARTED:
            return {
                ...state,
                loading: true
            }

        case ADD_BOOK_SUCCESS:
            return {
                ...state,
                loading: false,
                error: null,
                books: [...state.books, action.payload]
            }

        case ADD_BOOK_FAILURE:
            return {
                ...state,
                loading: false,
                error: action.payload.error
            }

        default: 
            return state
    }
}

错误--

{ ValidationError: book validation failed: title: Path `title` is required., aut
hor: Path `author` is required., genre: Path `genre` is required.
    at ValidationError.inspect (C:\Users\Leeko\documents\repos\libapp\backend\no
de_modules\mongoose\lib\error\validation.js:59:24)
    at formatValue (internal/util/inspect.js:526:31)
    at inspect (internal/util/inspect.js:194:10)
    at Object.formatWithOptions (util.js:90:12)
    at Console.(anonymous function) (console.js:204:15)
    at Console.warn (console.js:221:31)
    at b.save.then.catch.err (C:\Users\Leeko\documents\repos\libapp\backend\serv
er.js:34:31)
    at process.internalTickCallback (internal/process/next_tick.js:77:7)
  errors:
   { title:
      { ValidatorError: Path `title` is required.
          at new ValidatorError (C:\Users\Leeko\documents\repos\libapp\backend\n
ode_modules\mongoose\lib\error\validator.js:29:11)
          at validate (C:\Users\Leeko\documents\repos\libapp\backend\node_module
s\mongoose\lib\schematype.js:926:13)
          at C:\Users\Leeko\documents\repos\libapp\backend\node_modules\mongoose
\lib\schematype.js:979:11
          at Array.forEach (<anonymous>)
          at SchemaString.SchemaType.doValidate (C:\Users\Leeko\documents\repos\
libapp\backend\node_modules\mongoose\lib\schematype.js:935:19)
          at C:\Users\Leeko\documents\repos\libapp\backend\node_modules\mongoose
\lib\document.js:1941:9
          at process.internalTickCallback (internal/process/next_tick.js:70:11)
        message: 'Path `title` is required.',
        name: 'ValidatorError',
        properties: [Object],
        kind: 'required',
        path: 'title',
        value: undefined,
        reason: undefined,
        [Symbol(mongoose:validatorError)]: true },

sever.js(路由)

const mongoose    = require("mongoose");
const express     = require("express");
const bodyParser  = require("body-parser");

const db          = require('./config/db');

const Book        = require('./models/book');

const app         = express();

app.use(bodyParser.urlencoded({extended: true}));

app.route('/books')
    .get((req, res) => {
        Book.find({}).then(docs => res.json(docs))
    })
    .post((req, res) => {
        let b = new Book({
            title: req.body.title,
            author: req.body.author,
            genre: req.body.genre
        })

        b.save()
            .then(doc => console.log(doc))
            .catch(err => console.error(err))
        res.json(req.body)
    })

图书模型

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const BookSchema = new Schema({
    title: {
        type: String,
        // required: true,
        lowercase: true
    },
    author: {
        type: String,
        // required: true,
        lowercase: true
    },
    genre: {
        type: String,
        // required: true,
        lowercase: true
    },
    pages: {
        type: Number
    },
    available: {
        type: Boolean,
        default: true
    }
});

module.exports = Book = mongoose.model('book', BookSchema);

【问题讨论】:

    标签: javascript reactjs redux redux-thunk


    【解决方案1】:

    在我的server.js 中,我在下面丢失了:

    ...
    app.use(bodyParser.json());
    ...
    

    【讨论】:

      【解决方案2】:

      您可能需要在您的 axios 设置中支持完整的 url HOST,还请发布上下文错误日志

      【讨论】:

        【解决方案3】:

        axios调用的一个小改动

        axios
              .post('/books', {
                'title':title, 
                'author':author, 
                'genre':genre
              })
              .then(res => {
                dispatch(addBookSuccess(res.data))
              })
              .catch(err => {
                  dispatch(addBookFailure(err.message))
              })
        

        发布请求需要一个键值正文解析器

        【讨论】:

        • 这似乎并没有解决问题
        • 你能不能创建一个沙盒
        • 我正在记录 req.body 并且只得到 [object Object] 作为回报。我知道这引用了对象,但这一定是为什么没有任何东西保存到数据库中,对吗?有关如何纠正此行为的任何信息?
        • 您使用的是什么后端?如果是 expressjs 那么你需要安装 body-parser 并访问 req.body["title"], req.body["author"]...等。如果可能,创建一个沙盒
        • 正在处理这个问题,以前从未使用过沙箱。我已经添加了我的服务器文件和模型。
        猜你喜欢
        • 2019-08-05
        • 2017-05-28
        • 2017-08-30
        • 1970-01-01
        • 1970-01-01
        • 2021-02-01
        • 2019-02-02
        • 2018-11-10
        • 2020-07-12
        相关资源
        最近更新 更多