Nodejs关于处理ajax请求的困惑
Nodejs关于处理ajax请求的困惑
今天在看一个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()这么处理的吗?通常大神们的做法是怎样的?
当然可以。你的问题涉及到了如何在Node.js中正确地处理不同类型的HTTP请求,尤其是使用Express框架来处理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();
}
}
});
});
});
这段代码监听了带有.del
类的元素的点击事件。当用户点击时,它会从元素中提取ID,并通过AJAX发送一个DELETE
请求到服务器。如果服务器返回成功响应,它将删除对应的HTML元素。
Node.js Express处理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框架通过app.delete()
方法定义了一个处理DELETE
请求的路由。该路由检查请求参数中的id
,并尝试从数据库中删除与该ID关联的文档。
关于app.delete()
方法
确实,在Express的官方文档中,你可以找到app.delete()
方法。这个方法允许你定义一个路由处理器,专门用于处理DELETE
请求。同样,app.get()
, app.post()
, 和 app.put()
方法也分别用于处理GET、POST和PUT请求。
最佳实践
- 明确区分请求类型:在处理不同的HTTP方法时,确保你使用正确的HTTP动词(如
GET
,POST
,PUT
,DELETE
)。 - RESTful设计:考虑采用RESTful设计原则,使API更加清晰和易于理解。例如,可以使用
/admin/list/:id
这样的路径来表示删除特定资源。 - 错误处理:始终包括适当的错误处理逻辑,以确保在发生错误时能够妥善处理。
示例:改进后的代码
// 定义DELETE请求处理程序
app.delete('/admin/list/:id', function (req, res) {
const id = req.params.id;
// 假设Movie是一个Mongoose模型
Movie.findByIdAndRemove(id, function (err) {
if (err) {
console.error(err);
res.status(500).json({ error: "Internal Server Error" });
} else {
res.json({ success: 1 });
}
});
});
在这个改进版本中,我们使用了req.params.id
来获取URL中的ID,这使得路由更加简洁和直观。同时,我们也改进了错误处理部分,以提供更友好的错误信息。
后来搜索看到这么一篇文章,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的马甲,这些方法要浏览器支持吧
用post妥妥的
从来都用的get、post,中低高应用全搞定- -
<form action="/" method="post">
<input type="hidden" name="__method" value="delete" />
<input type="submit" value="Submit" />
</form>
restFul提倡用delete,不要用post。
为什么 我请求类似 /admin 的页面 会返回 500呢 求教
你提到的疑惑是有一定道理的。在 Express 中,并没有直接提供 app.delete()
这样的方法来处理 DELETE 请求。不过,你可以使用 app.route()
或者在 app
对象上直接调用 app.delete()
方法来处理 DELETE 请求。下面是详细的解答和示例代码。
解答
示例代码
const express = require('express');
const app = express();
const Movie = require('./models/Movie'); // 假设你已经定义了 Movie 模型
// 使用 app.route() 方法处理 DELETE 请求
app.route('/admin/list')
.delete((req, res) => {
const id = req.query.id;
if (id) {
Movie.remove({ _id: id }, (err, movie) => {
if (err) {
console.error(err);
res.status(500).json({ success: 0, message: "删除失败" });
} else {
res.json({ success: 1 });
}
});
} else {
res.status(400).json({ success: 0, message: "缺少ID参数" });
}
});
// 或者直接使用 app.delete() 方法
// app.delete('/admin/list', (req, res) => {
// const id = req.query.id;
// if (id) {
// Movie.remove({ _id: id }, (err, movie) => {
// if (err) {
// console.error(err);
// res.status(500).json({ success: 0, message: "删除失败" });
// } else {
// res.json({ success: 1 });
// }
// });
// } else {
// res.status(400).json({ success: 0, message: "缺少ID参数" });
// }
// });
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
解释
-
app.route()
方法:Express 提供了一个app.route()
方法,它允许你在同一个路由上定义多个 HTTP 方法的处理器。这种方式更灵活,可以同时处理 GET、POST、PUT 和 DELETE 等多种请求类型。 -
app.delete()
方法:虽然 Express 文档中没有明确列出app.delete()
方法,但实际上它是可用的,并且可以直接用于处理 DELETE 请求。这种方式更简单,但灵活性稍差。
最佳实践
- 如果你的应用需要处理多种 HTTP 方法(如 GET、POST、PUT、DELETE),建议使用
app.route()
方法,因为它更灵活。 - 如果只需要处理单一类型的 HTTP 方法,可以直接使用
app.get()
,app.post()
,app.put()
,app.delete()
方法。
通过以上方式,你可以更清晰地处理各种 HTTP 请求,并确保代码结构合理、易于维护。