【问题标题】:Using app.post() and app.put() for the same path对同一路径使用 app.post() 和 app.put()
【发布时间】:2015-11-08 14:41:53
【问题描述】:

关于如何使用 POST 和 PUT,我有一些不明白的地方

首先,如果您有一个带有method="post" 的表单,您可以使用 app.put("/path") 更改数据吗? 我知道我可以通过将 app.post() 与猫鼬一起使用来更改 req.body.name 中的特定数据。那么我为什么需要 PUT?

其次,我注意到如果您在表单上使用method="PUT" 并单击提交,我会在 url 中获得数据的查询字符串。即使我使用res.redirect("/path"),我也会得到查询字符串并且页面不会重定向。这正常吗?为什么我得到查询字符串?为什么不重定向

app.put("/myaction", function(req, res){
//originally i had it at req.body.name then browser  said that it "cannot POST"
//so I changed the method to PUT so thats why used req.query.name because I got
//the query string. if
name = req.query.name;
  Name.findOneAndUpdate({name : name}, {name : " Itwas changed through PUT "}, function(err, result){
        console.log("result : ", result);
       res.redirect("/result")
  })
})

如果我应该得到这些查询字符串,我应该如何更新数据库?

我还注意到,如果你有 app.post("/path") 和 app.put("/path") express 将使用 app.post 尤其是当你有 method="post" 所以你应该使用如果要允许用户在输入时更改姓名,是否要使用相同的表单?在这种情况下,新名称将是 'Itwas changed through PUT'

【问题讨论】:

    标签: javascript node.js http express


    【解决方案1】:

    您可以使用http 请求动词POSTPUT 将数据发送到服务器。但通常 POST 用于创建/插入数据,PUT 用于更新数据。

    如果有method="post"的表格不能用app.put()只能用

    app.post().
    

    您可以对同一路径使用不同的请求动词(get、post、put、delete)

    喜欢:

    app.route("/path")
        .post(function(req, res) {})
        .put(function(req, res) {})
        .get(function(req, res) {})
        .delete(function(req, res) {})
    

    实际上哪个函数会调用它取决于你对路径使用的请求动词。

    如果在 HTML 表单中使用 method='GET' 或在 ajax 中使用 type='GET' 或在服务中使用 $http.get() 然后调用 .get()

    如果 HTML 表单中的 method='POST' 或 ajax 中的 type='POST' 或服务中的 $http.post() 则调用 .post()

    如果 HTML 表单中的 method='PUT' 或 ajax 中的 type='PUT' 或服务中的 $http.put() 则调用 .put()

    如果 HTML 表单中的 method='DELETE' 或 ajax 中的 type='DELETE' 或服务中的 $http.delete() 则调用 .delete()

    For more details read this article

    【讨论】:

    • 感谢您的回答我想我今天学到了一些新东西。你说我不能将 app.put() 与method="post" 一起使用。唯一的其他方法是 get 所以可以肯定地说当方法值在表单上获取时您只能使用 .put() 吗?
    • 在您发表评论后编辑了我的帖子
    【解决方案2】:

    HTML 仅支持 post 和 get 作为方法。

    <form method="post"></form>
    

    <form method="get"></form>
    

    您只能将其他 [动词][1](包括 get 和 post)与 javascript 一起使用。

    例如使用 jquery http://api.jquery.com/jquery.ajax/

    为什么开发人员在他们的应用程序中使用多个动词?

    如果您确实使用名词而不是操作来命名您的路线,这对您来说更有意义。

    /books - GET - 获取书籍集合

    /books - POST - 插入到集合中

    /book/:id - GET - 获取带有 :id 的书

    /book/:id - PUT - 用 :id 更新书本

    /book/:id - DELETE - 删除带有 :id 的书

    你能告诉我为什么当我使用 put 并提交表单时,我在 url 中得到一个查询字符串吗?

    当您使用 POST、PUT、DELETE 方法向服务器发送请求时,您会使用 req.body。因为您使用 javascript(客户端)发送请求,所以您使用服务器上 req.body 的属性数据(见下文)设置值。

    //CLIENT
    $.ajax({
      method: "POST",
      url: "/books",
      data: { name: "Some random title"}
    })
      .done(function( msg) {
        alert( "Data inserted: " + msg );
      });
    
    
    
    //SERVER
    app.post('/books',function(req,res){
        console.log(req.body.name);
    }
    

    PS: 如果你想使用 req.body 你需要一个叫 body-parser https://www.npmjs.com/package/body-parser 的中间件

    服务器设置:

    var bodyParser = require('body-parser');
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({extended: false}));
    

    【讨论】:

    • 最近使用过 app.put("/path") 更新数据库中的数据吗?我的问题是我在 url 中得到一个带有更新数据的查询字符串。我想知道这是否是正常行为。因此,如果您可以对其进行测试并确认您是否获得了真正值得赞赏的字符串。如果你没有得到字符串或者你能够更新到 mongodb,请解释你是如何做到的。我知道 HTTP 方法的作用,并且我一直在使用 body-parser。感谢您回答有关 html 的问题。确认。没有人使用&lt;form method="put"&gt;。所以如果我想避免出错,我不应该再尝试了
    • 好的。我确实对此进行了测试。如果你使用 method="put" 它不会识别它,并且 HTML 会自动将他的请求与 method="get" 一起发送出去。 GET 的正常行为是将其附加到 URL。为什么它不重定向?如上所述,客户端使用 GET 发送他的请求(甚至 method="put" 除了 method="post" 或 method="get",因为它只知道 GET、POST)所以您的服务器路由无效并且不要触发它并且因此不要重定向。您需要将您的路线匹配的:app.put("/myaction", function(req, res){ 更改为:app.get("/myaction", function(req, res){
    • 但请注意,您正在使用 GET 进行更新。更好的方法是使用 javascript 来完成您的请求。 stackoverflow.com/questions/921942/javascript-rest-client
    • 感谢您的努力。我明天会看看这个,完成后可能会接受这个答案,如果我有任何问题,我会告诉你。
    【解决方案3】:

    POST 和 PUT 用于向服务器发送数据。你如何使用它们取决于你,但通常 POST 用于插入数据,PUT 用于更新数据

    Info about restful services

    【讨论】:

    • 感谢您的回答,但我知道该信息。你能告诉我为什么当我使用 put 并提交表单时,我会在 url 中得到一个查询字符串吗?
    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 2010-09-15
    • 2013-07-14
    • 2010-12-17
    • 1970-01-01
    相关资源
    最近更新 更多