首页 > 解决方案 > CRUD操作的不同方法有什么好处?

问题描述

在执行 CRUD 操作时,我们可以form如下执行:

      <form action="/todo/<%= todos[i]._id %>?_method=DELETE" method="POST">
           <button>x</button>
      </form>

控制器如下:

app.delete('/todo/:id', (req, res) => {
    Todo.findByIdAndDelete(req.params.id, (err) => {
        if(err) {
            console.log(err);
        } else {
            res.redirect('/todo');
        }
    });
});

或者我们可以使用 jQuery 执行它,如下所示:

$(document).ready(function(){

$('form').on('submit', function(){

    var item = $('form input');
    var todo = {item: item.val()};

    $.ajax({
      type: 'POST',
      url: '/todo',
      data: todo,
      success: function(data){
        //do something with the data via front-end framework
        location.reload();
      }
    });

    return false;
  });
});

这两种方法有什么区别?(忽略一个是执行“删除”,另一个是“发布”)有人说后者比前者更安全,但找不到任何有关它的文献。

标签: javascriptnode.jsexpressejs

解决方案


以下链接是该人简要提到这一点的地方[关于 ajax 请求更安全],尽管他没有提供任何解释 youtu.be/aZ16pkrMkZE?t=875

他在谈论完全不同的事情。通过 ajax 执行 DELETE 请求并通过单击简单链接删除应用程序中的对象(这将导致 GET 请求)。

后者不仅违反约定(GET 请求不应更改数据),而且……不是不安全,而是“危险”。想象一下,谷歌爬虫访问您的网站并跟踪每个链接。噗,你所有可删除的对象都不见了。

在某些情况下,它也可能不安全。想象一下,为了创建/更新/删除对象,您需要以某种方式对用户进行身份验证。说,使用身份验证令牌。由于它是普通链接和 GET 请求,因此令牌必须转到查询字符串。这样,它就会公开给每个人看到,缓存在每个缓存代理中,并永久存储在流量日志中。不是很安全。


推荐阅读