我正在尝试从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
}
任何帮助将不胜感激!
答案 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调用。