嗨,我有一个react组件,它呈现如下形式:
<form onSubmit={this.onSubmit}>
<!-- a bunch of inputs here -->
</form>
函数
onSubmit()
使用axios向/results
发出发布请求:handleSubmit(e) {
var self = this;
e.preventDefault();
const {value1, value 2, ....} = this.state;
axios.post('/results', {
key1 : value1,
key2 : value2,
etc.
}).then(function(response) {
if (errors) {
self.setState({errors: response.data.errorMessage});
}
}).catch(function(error){
console.log(error);
});
}
我的
server.js
中有一个用于发布请求的路由处理程序,该处理程序将表单中的数据插入数据库中。如果有错误,它将把数据发送回客户端,否则它将重定向到结果页面。该处理程序如下所示:app.post('/results', function(req, res, next) {
const reportExists = Report.findOne({
attributes: ['caseId'],
where: {caseId : req.body.caseId},
}).then(report => {
if (report) {
console.log("report already exists");
res.status(200).send({errorMessage : "Report has been submitted for this case id"});
} else {
const report = Report.create(
{
// data from form
}
).then(() => {
console.log('Record inserted successfully');
var caseId = req.body.caseId;
res.redirect("/results/" + caseId);
next();
})
.catch(err => {
console.log('failed to insert record');
res.status(200).send({errorMessage: "Failed to insert record"});
});
}
});
});
我还有另一个
app.get('/results/:caseId')
处理程序,该处理程序应为结果页面呈现适当的路由。但是,当记录成功插入时,它不会重定向到该页面,而是与表单保持在同一页面上。我的问题是,我应该从客户端还是服务器重定向到该页面? 最佳答案
通过客户端Javascript提交Ajax调用只是从服务器获取响应,无论响应是什么。重定向不会由浏览器自动处理,它只是对JavaScript的ajax响应。由客户端Javascript决定如何处理重定向响应。
您有两种选择。您可以在客户端Javascript中检测到重定向响应,然后在新位置设置window.location
并手动告诉浏览器转到新页面。或者,您可以让浏览器提交表单而不是客户端Javascript,然后浏览器将自动遵循重定向响应。
同样,在调用next()
之后,您不应再调用res.redirect()
。发送响应后,您不应启用其他路由处理程序。