Javascript React JS中的AJAX请求不';行不通
我试图通过AJAX请求从数据库中获取信息,但未触发成功事件 但是,服务器会接收AJAX请求,因为它会触发终端中正确的控制台日志 我正在Node中使用Express框架构建它 下面是触发AJAX调用的代码。“componentDidMount触发器”记录到控制台。但后来它停止了。即使我知道服务器接收到AJAX请求,console.log“success”或“error”也不会被触发Javascript React JS中的AJAX请求不';行不通,javascript,ajax,node.js,reactjs,Javascript,Ajax,Node.js,Reactjs,我试图通过AJAX请求从数据库中获取信息,但未触发成功事件 但是,服务器会接收AJAX请求,因为它会触发终端中正确的控制台日志 我正在Node中使用Express框架构建它 下面是触发AJAX调用的代码。“componentDidMount触发器”记录到控制台。但后来它停止了。即使我知道服务器接收到AJAX请求,console.log“success”或“error”也不会被触发 app.get('/api/:name', function (req,res){ name = req.p
app.get('/api/:name', function (req,res){
name = req.params.name;
Member.findOne({username: name}, function(err,member){
res.setHeader('Content-Type', 'application/json');
res.write(member.toString());
console.log('member fetched from DB: ', member);
res.end();
});
});
我也没有收到任何其他错误,所以我不知道为什么这不起作用
有人能帮忙吗
更新:谢谢你的帮助。我现在更近了一步。在处理AJAX请求时,我没有意识到我需要“res.end”。当我改变这一点时,我设法得到了一个响应,尽管这是一个错误
Her是服务器端代码:
app.get('/api/:name', function (req,res){
name = req.params.name;
Member.findOne({username: name}, function(err,member){
res.setHeader('Content-Type', 'application/json');
res.write(member.toString());
console.log('member fetched from DB: ', member);
res.end();
});
});
与您的问题无关,但与找出原因同样重要。没有调用success:您的代码没有在success处理程序中调用Main的
setState
,因为success函数不是“在您的组件中”调用的,而是“由jQuery在某处”调用的
如果要在组件上调用setState
,作为成功处理的一部分,请缓存该组件,然后在该组件上调用组件函数:
var self = this;
$.ajax({
...
success: function() {
self.setState({ ... });
}
...
或者使用JavaScriptbind
函数(与jQuery.bind无关)显式地将success函数的执行上下文设置为您的组件:
...
success: function(data) {
console.log('success')
this.setState({data: data});
}.bind(this),
...
我的错误在res.write(member.toString())中。我不得不将其更改为res.write(JSON.stringify(member)),因为客户端请求一个JSON文件。如果没有调用console.log,我会仔细检查控制台是否有错误,并检查网络选项卡以查看发送了什么响应。此外,您的
success
回调中的this
也不正确。最简单的修复方法是捕获this
:var self=this在调用$.ajax
之前使用code>,然后在闭包中使用self
:self.setState(
。如果您看到服务器接收到请求,您还可以说您正在使用服务器端,以及如何生成响应吗?开发工具中的“网络”选项卡在该请求发生时会说什么?它是否会说您正在起诉GET当您想要发布时(反之亦然),请求是否有效,但您从未得到回复(因为你的服务器可能忘了发送响应结束?)等等。对那些投反对票的人说:请记住,Stackoverflow上的有效响应“通常是有用的或有帮助的”回答,即使他们没有解决原始问题。最终只有真正的答案才会被接受,但这个答案太长,无法发表评论,而且肯定解决了原始问题的问题,即使海报没有注意到问题。在这种情况下,你不想res.write(…)
总之,您需要res.json(member)
(如果您使用的是express?),它接受一个对象并将其作为json序列化文本发送出去。谢谢,我不知道这个方法。工作非常完美!