POST请求正常但Ajax的success/error回调未触发问题求助(Node.js+MongoDB+Jade)
解决Ajax回调不触发的问题
我之前也碰到过一模一样的情况——POST请求明明成功执行了,但success和error回调就是纹丝不动,给你几个排查方向和解决办法:
1. 先阻止表单的默认提交行为
大概率是这个原因!你的按钮绑定在表单里,如果没阻止表单的原生提交,浏览器会在触发Ajax的同时刷新页面,导致回调还没来得及执行就被页面跳转打断了。
你已经在事件里传了e参数,直接加一行阻止默认行为就行:
$('#add_cmt_btn').click(function (e) { e.preventDefault(); // 关键:阻止表单默认提交 $.ajax({ type: 'POST', url: '/comments/add', data: $("#add_cmt_form").serialize(), success: function () { console.log('success'); $('#comment-text').val(''); $("#comments-block").load(location.href + " #comments-block>*", ""); }, error: function (err) { console.log('error: ' + err); } }); })
或者更稳妥的方式,把按钮类型改成button,避免它默认触发表单提交:
button(type='button', id='add_cmt_btn') 提交评论
2. 检查服务器返回的响应状态与格式
Ajax的success回调只在服务器返回2xx状态码时触发,如果服务器返回的是3xx(比如重定向)或者5xx,或者返回的内容格式和你默认期望的不一致(比如你没指定dataType,jQuery默认猜是JSON,但服务器返回了HTML),也会导致回调异常。
打开浏览器开发者工具的「Network」面板,找到/comments/add这个请求:
- 看「Status Code」是不是200或其他2xx的数值;
- 看「Response」里的内容是不是合法的格式,如果是HTML或纯文本,就在Ajax配置里加上
dataType: 'html'(或text)明确指定:
$.ajax({ type: 'POST', url: '/comments/add', data: $("#add_cmt_form").serialize(), dataType: 'html', // 根据实际返回类型调整 success: function () { /* ... */ }, error: function (err) { /* ... */ } });
3. 排查全局Ajax拦截的影响
如果项目里用了$.ajaxSetup()或者其他全局Ajax钩子,有可能不小心覆盖了回调逻辑。可以临时在你的Ajax配置里加global: false禁用全局事件,测试是不是这个问题:
$.ajax({ type: 'POST', url: '/comments/add', global: false, // 禁用全局Ajax事件 // 其他配置 });
先从阻止默认提交开始试,这个是最常见的坑!
内容的提问来源于stack exchange,提问作者Evgeny Gil
相关产品推荐
相关产品推荐

