【问题标题】:How to retrieve data from form using a POST route?如何使用 POST 路由从表单中检索数据?
【发布时间】:2018-01-09 01:31:34
【问题描述】:

我正在尝试从 Bootstrap 表单元素中检索数据,并使用 Express 和 Knex 将其保存到 PostgresSQL 数据库。运行路线时没有错误;但是,表单中的数据保存为空。这是我的表单元素(我正在使用 React):

render() {
  return (
    <form>
      <div className ="form-group">
        <label>Add a Note:</label>
        <textarea className="form-control" name="note" rows="5">
        </textarea>
      </div>
      <button onClick={this.handleClick} className="btn btn-primary" 
      type="submit">Submit</button>
    </form>
  )
}

这是我对 POST 路由的获取:

handleClick(e) {
  e.preventDefault()
  fetch('/create-note', {
    method: 'POST'
  })
}

这是我的 Express POST 路由(app.use(bodyParser.json()) 包含在此文件中):

app.post('/create-note', (req, res) => {
  postNote(req.body.note)
    .then(() => {
      res.sendStatus(201)
    })
})

这里是 Knex postNote 功能:

export function postNote(newNote) {
  const query = knex
    .insert({ note_content: newNote })
    .into('notes')

  return query
}

任何帮助将不胜感激!

【问题讨论】:

    标签: javascript reactjs express knex.js


    【解决方案1】:

    对于 POST 请求,您可能必须等待数据主体准备好。试试这个

    app.post('/create-note', (req, res) => {
        var body = '';
        request.on('data',function(data) { body += data; });
        request.on('end', function(data) {
            postNote(body)
                .then(() => {
                    res.sendStatus(201)
                })
        });
    })
    

    【讨论】:

    • 感谢您的快速回复!我仍然得到相同的结果,表单中的数据仍然为空。
    【解决方案2】:

    在您的标记中尝试以下操作,并放弃使用 fetch

    ...
    <form method="POST" action="/create-note" enctype='application/json'>
        ...
    </form>
    ...
    

    或者由于表单的默认编码是application/x-www-form-encoded(doc),请将以下中间件添加到您的快速应用程序中......

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

    你也可以试试……

    ...
    <button ref="form" onClick={this.handleClick} className="btn btn-primary" 
          type="submit">Submit</button>
    ...
    

    随着

    handleClick(e) {
      e.preventDefault();
      const data = new FormData(this.refs.form);
    
      fetch('/create-note', {
        method: 'POST',
        body: data
      })
    
    }
    

    【讨论】:

    • 感谢您的回复,但这也没有用。
    • hmmmm,您还有其他调试信息吗?后路由处理程序中的 console.log(req.body)?
    • req.body 和 req.body.note 都未定义
    • 当您尝试第一个解决方案时,您是否删除了您的点击处理程序?
    • 你添加了 url 编码的 bodyparser 中间件?你的源代码在 github 上吗?
    【解决方案3】:

    我找到了一个解决方案并想发布它以防其他人遇到类似问题。问题是我没有正确查询 textarea 的值,所以我将一个未定义的变量传递给数据库进行保存。 这是我想出的解决方案:

    handleSubmit(e) {
      const data = new FormData(e.target)
      const text = {note: data.get('note')}
      fetch('/create-note', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(text)
      })
    }
    
    render() {
      return (
        <form onSubmit={this.handleSubmit}>
          <div className ="form-group">
            <label>Add a Note:</label>
            <textarea className="form-control" name="note" rows="5">
            </textarea>
            <button ref="textarea" className="btn btn-primary" 
            type="submit">Submit</button>
          </div>
        </form>
      )
    }
    

    我在表单上放置了一个 onSubmit 事件监听器,并使用表单创建了一个新的 FormData 实例。然后我创建了一个包含 textarea 值的对象以传递给 fetch 调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 2015-03-18
      • 2015-04-05
      • 1970-01-01
      相关资源
      最近更新 更多