今天在看一个node的视频课程,其中有一个浏览器发送了ajax type为‘delete’的请求,看到视频教程的源码,很震惊。 直接贴代码:
jquery处理ajax请求代码如下:
$(function () {
$('.del').click(function (e) {
var target = $(e.target);
var id = target.data('id');
var tr = $('.item-id-'+id);
$.ajax({
type: 'DELETE',
url: "/admin/list?id=" +id
})
.done(function (results) {
if (results.success === 1) {
if (tr.length > 0) {
tr.remove()
}
}
})
})
})
node处理这个delete请求代码如下
app.delete('/admin/list',function(req,res){
var id = req.query.id;
if(id){
Movie.remove({_id: id},function(err,movie){
if(err){
console.log(err)
}
else{
res.json({success:1})
}
})
}
});
上面的代码我测试运行是没有问题的。 问题来了,express API里面我没有找到app.delete()方法,对于ajax的get/post/put/delete请求,node代码是这么写的吗?app.get() app.post(),app.put(),app.delete()这么处理的吗?通常大神们的做法是怎样的?
后来搜索看到这么一篇文章,Develop a RESTful API Using Node.js With Express and Mongoose 。贴出来看看,这篇文章这么写是不是过时了? 现在处理ajax的4种请求get/post/put/delete该用什么方法呢?
源码对于 https://www.npmjs.org/package/methods 这里面的每个方法都提供了支持。文档比较简单所以漏写了而已。
jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ? // Support: IE6+ function() {
return !this.isLocal && /^(get|post|head|put|delete|options)$/i.test( this.type ) && createStandardXHR() || createActiveXHR();
} : // For all other browsers, use the standard XMLHttpRequest object createStandardXHR; head|put|delete 都是post的马甲,这些方法要浏览器支持吧
@coolicer 嗯嗯,要看浏览器支持,否则除了 get 都是用 post 在模拟。 可以看看这里:https://www.npmjs.org/package/method-override
@alsotang 把put/delete类型改成post是可以用的,看来put/delete都是post的马甲没错。例如上面的代码改成:
$(function () {
$('.del').click(function (e) {
var target = $(e.target);
var id = target.data('id');
var tr = $('.item-id-'+id);
$.ajax({
type: 'POST',
url: "/admin/list?id=" +id
})
.done(function (results) {
if (results.success === 1) {
if (tr.length > 0) {
tr.remove()
}
}
})
})
})
var id = req.query.id;
if(id){
Movie.remove({_id: id},function(err,movie){
if(err){
console.log(err)
}
else{
res.json({success:1})
}
})
}
});
测试也是没有问题的。你说的method-override可以解决delete/put方法的兼容性问题,还没测试,应该可用。
用post妥妥的
@xuyuan923 工大的?
从来都用的get、post,中低高应用全搞定- -
@tofrookie 是的。校友?
<form action="/" method="post">
<input type="hidden" name="__method" value="delete" />
<input type="submit" value="Submit" />
</form>
restFul提倡用delete,不要用post。
@tulayang 你这样做当然可以的。我是用的ajax异步删除,你用的是form的形式删除的。 还有,你这样的方法也是post,只是设置了value是delete。
@xuyuan923 是啊,握个手
为什么 我请求类似 /admin 的页面 会返回 500呢 求教
我也是在慕课网上看的,为什么我点删除时却要刷新后才显示已经删除掉了