2017-12-30 20 views
2

私はユーザーからデータを受け取り、バックエンドAPIサーバーに投稿するために使用するredux形式を使用していますサーバーにデータをポストしている間に、サーバーにポストされている各データセットの一意のIDを生成したいので、あとでIDを使用してその特定のセットを参照してユーザーに表示することができます。一連のデータをサーバーにポストする際に、その一意のIDを自動的に生成する方法は?無料のAxiosライブラリを使用してAPIサーバーに投稿されたデータの一意のIDを自動的に生成する方法

Reduxのフォームのためのコードは以下の通りです:作成するための

//Action Creator for creating posts 
export function createPosts(values, callback) { 

    return dispatch => { 
    return axios.post(`${API}/posts`,values,{headers}) 
     .then((data) => { 
     callback(); 
     console.log(data) 
     dispatch({ 
     type: CREATE_POST, 
     payload: data 
     }) 
    }) 
    } 
} 

リデューサー:新しい投稿を作成するための

import React, { Component } from 'react'; 
import { Field, reduxForm } from 'redux-form'; 
import { Link } from 'react-router-dom'; 
import { connect } from 'react-redux'; 
import { createPosts } from '../actions/posts_action'; 

class CreatePost extends Component { 
    constructor() { 
    super(); 
    this.state = { 
     selectValue : '' 
    }; 
    this.handleChange = this.handleChange.bind(this); 
    this.renderCategory = this.renderCategory.bind(this); 
} 

    renderField(field) { 
     return(
     <div className="title-design"> 
      <label className="label-design"> {field.label} </label> 
      <input 
       type="text" 
       className="title-input" 
       {...field.input} 
      /> 
      <div className="text-help has-danger"> 
       {field.meta.touched ? field.meta.error : ''} 
      </div> 
     </div> 
    ); 
    } 

    handleChange(e) { 
    const value=e.target.value; 
    this.props.change("categories",value); 
    this.setState({selectValue: value},() => { 
     console.log(value) 
    }); 
    } 

    renderCategory(field) { 
    return(
     <div className="title-design"> 
     <label className="label-design">{field.label} </label> 
      <Field name="category" className="title-input" component="select"> 
      <option></option> 
      <option value="react">React</option> 
      <option value="redux">Redux</option> 
      <option value="udacity">Udacity</option> 
      </Field> 

      <div className="text-help has-danger"> 
      {field.meta.touched ? field.meta.error : ''} 
      </div> 
     </div> 
    ); 
    } 

    onSubmit(values) { 
     this.props.createPosts(values,() => { 
      this.props.history.push('/'); 
     }); 
    } 



    render() { 
     const { handleSubmit } = this.props; 

     return (
     <form onSubmit={handleSubmit(this.onSubmit.bind(this))}> 
      <Field 
      label="Title for Post" 
      name="title" 
      component={this.renderField} 
      /> 

      <Field 
      label="Post Content" 
      name="body" 
      component={this.renderField} 
      /> 

      <Field 
      label="Category" 
      name="category" 
      component={this.renderCategory} 
      /> 



      <button type="submit" className="btn btn-primary">Submit</button> 
      <Link to="/"> 
      <button className="cancel-button">Cancel</button> 
      </Link> 
     </form> 
    ); 
    } 
} 

function validate(values) { 
    const errors = {} ; 

    if (!values.title) { 
     errors.title = "Enter a title"; 
    } 

    if (!values.body) { 
    errors.body = "Enter some content"; 
    } 

    if(!values.category) { 
    errors.category = "Please select a category"; 
    } 

    if (!values.id) { 
     errors.id = "ID not generated"; 
    } 

    return errors; 
} 

export default reduxForm({ 
    validate : validate,   //validate 
    form : 'CreatePostForm' 
})(
    connect(null,{ createPosts })(CreatePost) 
); 

アクションの作成者を以下に示します。投稿:

import _ from 'lodash'; 
import { FETCH_POSTS, FETCH_POST, CREATE_POST } from '../actions/posts_action'; 

export default function(state = {}, action) { 
    switch (action.type) { 
    case FETCH_POST: 
     // const post = action.payload.data; 
     // const newState = { ...state, }; 
     // newState[post.id] = post; 
     // return newState; 
     return {...state, [action.payload.id]: action.payload}; 

    case FETCH_POSTS: 
    return {posts: { ...state.posts, ...action.payload }}; 

    case CREATE_POST: 
     return {posts: { ...state, ...action.payload}}; 

    default: 
     return state; 
    } 

} 

したがって、サーバーに送信される各データセットのIDを生成する方法はありますか?

編集1:

私は下図のように私をonSubmit()メソッドにUUIDを追加しようとしていますが、それはwork.Iは、それが行われるべきか、私がしなければならない方法はない座っていません。それは別の方法ですか?

onSubmit(values) { 

      this.props.createPosts(values,() => { 
      uuidv1(); 
      this.props.history.push('/'); 
     }); 
    } 

編集2:記事のための

Severのファイル:

const clone = require('clone') 

let db = {} 

const defaultData = { 
    "8xf0y6ziyjabvozdd253nd": { 
    id: '8xf0y6ziyjabvozdd253nd', 
    timestamp: 1467166872634, 
    title: 'Udacity is the best place to learn React', 
    body: 'Everyone says so after all.', 
    author: 'thingtwo', 
    category: 'react', 
    voteScore: 6, 
    deleted: false, 
    commentCount: 2 
    }, 
    "6ni6ok3ym7mf1p33lnez": { 
    id: '6ni6ok3ym7mf1p33lnez', 
    timestamp: 1468479767190, 
    title: 'Learn Redux in 10 minutes!', 
    body: 'Just kidding. It takes more than 10 minutes to learn technology.', 
    author: 'thingone', 
    category: 'redux', 
    voteScore: -5, 
    deleted: false, 
    commentCount: 0 
    } 
} 

function getData (token) { 
    let data = db[token] 
    if (data == null) { 
    data = db[token] = clone(defaultData) 
    } 
    return data 
} 

function getByCategory (token, category) { 
    return new Promise((res) => { 
    let posts = getData(token) 
    let keys = Object.keys(posts) 
    let filtered_keys = keys.filter(key => posts[key].category === category && !posts[key].deleted) 
    res(filtered_keys.map(key => posts[key])) 
    }) 
} 

function get (token, id) { 
    return new Promise((res) => { 
    const posts = getData(token) 
    res(
     posts[id].deleted 
     ? {} 
     : posts[id] 
    ) 
    }) 
} 

function getAll (token) { 
    return new Promise((res) => { 
    const posts = getData(token) 
    let keys = Object.keys(posts) 
    let filtered_keys = keys.filter(key => !posts[key].deleted) 
    res(filtered_keys.map(key => posts[key])) 
    }) 
} 

function add (token, post) { 
    return new Promise((res) => { 
    let posts = getData(token) 

    posts[post.id] = { 
     id: post.id, 
     timestamp: post.timestamp, 
     title: post.title, 
     body: post.body, 
     author: post.author, 
     category: post.category, 
     voteScore: 1, 
     deleted: false, 
     commentCount: 0 
    } 

    res(posts[post.id]) 
    }) 
} 

function vote (token, id, option) { 
    return new Promise((res) => { 
    let posts = getData(token) 
    post = posts[id] 
    switch(option) { 
     case "upVote": 
      post.voteScore = post.voteScore + 1 
      break 
     case "downVote": 
      post.voteScore = post.voteScore - 1 
      break 
     default: 
      console.log(`posts.vote received incorrect parameter: ${option}`) 
    } 
    res(post) 
    }) 
} 

function disable (token, id) { 
    return new Promise((res) => { 
     let posts = getData(token) 
     posts[id].deleted = true 
     res(posts[id]) 
    }) 
} 

function edit (token, id, post) { 
    return new Promise((res) => { 
     let posts = getData(token) 
     for (prop in post) { 
      posts[id][prop] = post[prop] 
     } 
     res(posts[id]) 
    }) 
} 

function incrementCommentCounter(token, id, count) { 
    const data = getData(token) 
    if (data[id]) { 
    data[id].commentCount += count 
    } 
} 

module.exports = { 
    get, 
    getAll, 
    getByCategory, 
    add, 
    vote, 
    disable, 
    edit, 
    getAll, 
    incrementCommentCounter 
} 
+0

一般的に、一意のIDを生成してレスポンスと共に渡すデータ –

+0

@ShubhamKhatri新しい投稿を作成しようとすると、投稿のidプロパティが表示されません。上のサーバーファイルを編集に貼り付けました。ご覧ください。 – pranami

答えて

1

さて、通常、あなたがして、サーバがそのIDを生成させたいの一環として、バックダウンそれを送信クライアントが実際にIDを生成したい場合は、uuidを使用することをお勧めします。 https://www.npmjs.com/package/uuid

ドキュメントから

例:

const uuidv4 = require('uuid/v4'); 
uuidv4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1' 

あなたはより多くのコードを追加した、と私はあなたがより良いあなたのサーバー上でuuidv4()を使用して務めていると思います。次のようになります。

function add (token, post) { 
    return new Promise((res) => { 
    let posts = getData(token) 
    let id = uuidv4(); 

    posts[id] = { 
     id: id, 
     timestamp: post.timestamp, 
     title: post.title, 
     body: post.body, 
     author: post.author, 
     category: post.category, 
     voteScore: 1, 
     deleted: false, 
     commentCount: 0 
    } 

    res(posts[id]) 
    }) 
} 

このようにして、IDがサーバー上に生成されます。クライアントはもはやuuidに依存する必要はなく、有効なIDを生成するためにクライアントを「信頼する」わけではありません。 idはレスポンスの一部としてクライアントに返され、編集などの際にクライアントから使用することができます。

+0

返信いただきありがとうございます。試してみてください。数分で結果を更新してください。 – pranami

+0

私はそれをインポートした後、私のonSubmitメソッドでuuidv1()を追加しようとしましたが、私はadded.I編集したコードを追加しましたが表示されません。あなたはそれを見て、 ? – pranami

+1

あなたはIDを提出したいと思いましたか?結果のID値を使用せずにメソッドを呼び出すだけです。プッシュされる値にuuidv1()の結果を追加して、サーバーが結果の一部として右に戻すことができます。 "values [id] = uuidv1();"あなたはアキシオスコールをする前に。 – billjamesdev

関連する問題