在Chrome中发生Sequelize查询和PUT错误

学生问题!

我正在学习使用Sequelize ORM的Node.js / Express和MySQL数据库。 传统上,在我们简单的应用程序中,在使用Sequelize查询MySQL数据库之后,我们将在Express PUT路由中发出res.redirect('/') ,然后类似如下:

 app.post("/", function (req, res) { db.Burgers.create({ burger_name: req.body.burger_name }).then(function () { res.redirect('/'); }); }); 

当使用findOrCreate()方法创build一个sequelize查询时,我遇到了一个问题。 也就是说,我正在努力寻找将res.redirect语句放在AJAX PUT请求上的位置。 出于某种原因,当我在PUT语句的快速path中附加了res.redirect('/')时,Chromenetworking检查器中将看到重复的PUT请求。 第一个PUT请求显示为(localhost:3000 / devour,input:text / plain,status:302)。

两个PUT请求

Express服务器接收到PUT请求,并且继续查询成功,更新MySQL数据库中正确的表。 但是,Express路由redirect不成功,Chrome Inpector显示错误“PUT http:// localhost: 3000/404(Not Found)”,当我看到networking选项卡时,我看到第二个PUT请求(localhost: 3000 /,input:xhr,status:404)。

这是Express PUT路线:

 app.put("/devour", function (req, res) { var customerId; // Check to see if the customer name entered already exists, if not create db.Customers.findOrCreate({ where: { customer_name: req.body.customer_name } }) .spread((user, created) => { if (created) console.log("User created"); customerId = user.id; var update = { "devoured": req.body.devoured, "CustomerId": customerId }; db.Burgers.update(update, { where: { id: req.body.id } }).then(function () { res.redirect('/'); }); }) }); 

什么是生成第二个PUT请求? 这是一个回应,而不是要求?

这是我使用findOrCreate()方法的第一个Sequelize查询,所以也许我会误导使用.spread()。

如果我注释掉PUT Express路由上的res.redirect,则不会发生错误,但我必须手动刷新页面以查看来自MySQL数据库的更新数据。

= = = = = = = = = = = = = = = = = = = = = =
我添加了303状态码到我的Express PUT路由:res.redirect(303,'/')。 这会消除redirect时的404错误,但是HTML页面并未使用GET请求进行刷新,以便使用PUT请求中的更新重新加载页面。

然后,我看着我的Ajax调用,并意识到,也许,我需要在那里添加代码来处理来自服务器的响应:

 $.ajax({ url: URL, type: 'PUT', contentType: 'application/json', data: JSON.stringify(dataObject) }) 

所以我添加了一个.done promisecallback,并且页面在PUT请求之后成功刷新:

 $.ajax({ url: URL, type: 'PUT', contentType: 'application/json', data: JSON.stringify(dataObject) }).done(function(){ window.location.href = window.location.origin + '/' }) 

我想我有点困惑,为什么单独的服务器端res.redirect(303,'/')不会导致在客户端刷新页面。 提供“/”path作为参数的意义何在?

谢谢!

你可以阅读更多关于什么redirect头包含在PUT请求时为什么POSTredirect到GET和PUTredirect到PUT?

长话短说你的PUT请求仍然是一个PUT请求,只是被redirect到/

如果您提供了303个状态码,您的应用程序应该可以正常工

 res.redirect( 303, '/' );