如何使用POST路由从表单中检索数据?

时间:2017-08-02 02:14:42

标签: javascript reactjs express knex.js

我正在尝试从Bootstrap表单元素中检索数据,并使用Express和Knex将其保存到PostgresSQL数据库。我运行路线时没有错误;但是,表单中的数据保存为null。这是我的表单元素(我使用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
}

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分: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)
            })
    });
})

答案 1 :(得分:1)

在您的标记中尝试以下操作,并使用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
  })

}

答案 2 :(得分:0)

我找到了一个解决方案,想要发布它,其他任何人遇到类似的问题。问题是我没有正确查询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调用。