【问题标题】:How can I define a Schema and the express router in MERN stack?如何在 MERN 堆栈中定义模式和快速路由器?
【发布时间】:2018-12-08 19:21:45
【问题描述】:

我需要使用这样的 mongodb 记录:

{
    "_id": {
        "$oid": "5c09ae281646e8d8bad07d73"
    },
    "name": "somename",
    "genre": "somegenre",
    "indexes": {
        "index1": 1,
        "index2": 7,
        "index3": 7,
        "index4": 7,
        "index5": 7,
        "index6": 7,
        "index7": 7,
        "index8": 7,
        "index9": 7,
        "index10": 7,
        "index11": 7,
        "index12": 9,
        "index13": 5,
        "index14": 15,
        "index15": 8,
        "index16": 17
    },
    "date": {
        "$date": "2018-12-06T23:18:00.532Z"
    },
    "__v": 0
}

我为猫鼬设置了这样的架构

const ItemSchema = new Schema({
  name: {
    type: String,
    required: true
  },
  genre: {
    type: String,
    required: true
  },
  indexes: {
    type: Object,
    required: true,
    properties: {
      index1: {
        type: Number,
        required: true
      },
      index2: {
        type: Number,
        required: true
      },
      index3: {
        type: Number,
        required: true
      },
      index4: {
        type: Number,
        required: true
      },
      index5: {
        type: Number,
        required: true
      },
      index6: {
        type: Number,
        required: true
      },
      index7: {
        type: Number,
        required: true
      },
      index8: {
        type: Number,
        required: true
      },
      index9: {
        type: Number,
        required: true
      },
      index10: {
        type: Number,
        required: true
      },
      index11: {
        type: Number,
        required: true
      },
      index12: {
        type: Number,
        required: true
      },
      index13: {
        type: Number,
        required: true
      },
      index14: {
        type: Number,
        required: true
      },
      index15: {
        type: Number,
        required: true
      },
      index16: {
        type: Number,
        required: true
      }
    }
  },

他们是我的路由器帖子(快递)

router.post("/", (req, res) => {
  const newItem = new Item({
    name: req.body.name,
    genre: req.body.genre,
    indexes: {
      index1: req.body.indexes.index1,
      index2: req.body.indexes.index2...

他们输入设置索引值(我使用名称属性来定义我将如何设置新项目):

  <input
    type="text"
    name="indexes.index1"
    placeholder="sample 1"
    onChange={this.onChange}
  />

和功能

  onChange = e => {
    this.setState({ [e.target.name]: e.target.value });
  };

onSubmit = e => {    
    const newItem = {
      name: this.state.name,
      genre: this.state.genre,
      indexes: {
        index1: this.state.indexes.index1,
...

他们在 MongoDB 中的结果是:

{
    "_id": {
        "$oid": "5c0c22d41e3d5115dda930aa"
    },
    "name": "name",
    "genre": "somegen",
    "indexes": {
        "index1": "",
        "index2": ""

索引中没有值 任何的想法?建议?

谢谢各位。 塞巴

【问题讨论】:

  • 您能否更具体地谈谈“我尝试创建新项目时遇到问题”?究竟会发生什么?
  • 是的,当然,当我尝试从输入表单设置其中一个索引的值时,我使用名称:indexes.index1 但在创建新项目时不起作用
  • new Item() 之前是否有req.body 的输出?您可以将其添加到问题中,这将非常有帮助。在const newItem ... 之前的console.log( req.body ) 之类的东西会这样做。
  • 是的,我在原始问题中添加了,谢谢

标签: javascript node.js reactjs mongodb express


【解决方案1】:

问题在于您的setState ReactJS 调用。

onChange = e => {
    this.setState({ [e.target.name]: e.target.value });
};

target.name 始终是一个字符串,所以您正在做的是使用包含 . ( indexes.index1 ) 的键设置属性,因此您在 onChange 事件之后的状态看起来像:

state = {
    "name": "name",
    "genre": "somegen",
    "indexes.index1": "1",
    "indexes.index2": "2",
    ...
}

express 无法识别此内容,并且您的请求未能提供正确的正文。

您可以通过将索引以某种方式转换为对象来实现您想要的。最简单的设置方法是:

onChange = e => {

    if ( e.target.name.indexOf( "indexes" ) === 0 ) {
        this.setState({ indexes: Object.assign( this.state.indexes || {}, {
            [e.target.name.replace(/^indexes\./, "")]: e.target.value
        } ) } );
    } else {
        this.setState({ [e.target.name]: e.target.value });
    }
};

如果您的应用程序结构允许,您可以将定义索引的输入移动到另一个组件中,该组件将作为回调整个indexN 对象。这将帮助您简单地更新状态,而无需解析索引键。

【讨论】:

  • 现在正在工作,我只是根据您的建议更改 onChange 并且工作正常
猜你喜欢
  • 2021-07-27
  • 2015-04-12
  • 1970-01-01
  • 2020-10-17
  • 2021-02-12
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多