Javascript 对Express应用程序的Ajax调用不传递数据

Javascript 对Express应用程序的Ajax调用不传递数据,javascript,json,ajax,reactjs,express,Javascript,Json,Ajax,Reactjs,Express,我正在使用React和Express构建一个应用程序。从React组件中,我调用了一个针对某个Express route的ajax函数。但是,我的路由处理程序不接收随Ajax请求传递的数据 我的Express应用程序(出于测试目的,我将特定路线放在主app.js中): 我的Ajax函数(调用时reqData为{id:this.props.id}): 我知道bodyParser正在工作,因为路由处理程序中的console.log将{}打印到服务器端控制台,指示req.body为空 我已经尝试过将r

我正在使用React和Express构建一个应用程序。从React组件中,我调用了一个针对某个Express route的ajax函数。但是,我的路由处理程序不接收随Ajax请求传递的数据

我的Express应用程序(出于测试目的,我将特定路线放在主app.js中):

我的Ajax函数(调用时reqData为{id:this.props.id}):

我知道bodyParser正在工作,因为路由处理程序中的console.log将{}打印到服务器端控制台,指示req.body为空

我已经尝试过将reqData传递到xhr.send,有JSON和没有JSON.stringify,两者都不起作用。但是json可以完美地打印到浏览器控制台


我完全不知道我的要求要到哪里去。我是否从根本上误解了xhr.send和Express routes是如何交互的?

为什么不尝试使用某种ajax库,如:

好的,现在我想我知道问题出在哪里了-这是您在xhr中使用的方法:

xhr.open(method, url);
如果使用GET,则不会有请求主体。如果使用POST,则处理程序位于
/routes/list
中的某个位置

假设您只在提供的代码段中执行
console.log
,那么实际使用的是GET。根据:

XMLHttpRequest.send()方法发送请求。[…]send()接受 请求正文的可选参数。如果请求方法是GET 或HEAD,则忽略该参数,并将请求正文设置为null


一点挑剔:在
app.get('/lists/show'.
)中不需要第二个
bodyParser.json()
,因为您已经在
app.use(bodyParser.json())中全局使用了它
。虽然我不希望它会把事情搞砸。哈哈,是的,我一开始没有,我在调试时添加了它,看看它是否有影响,但忘了把它取出来。首先,我认为我的代码是完全可以接受的,我想知道它为什么不起作用。将来我可能会用一个。谢谢!这看起来肯定是正确的,我会的我回家后会测试它。所以如果我想在请求中传递参数,如果我想使用get,我必须在URI中传递它?如果我想使用req.body,我必须使用POST请求?我所要做的就是返回一个与我传递的ID对应的数据库文档,所以我假设get会更好?是的,没错。从语义上说,POST用于创建或处理某些内容(提交表单、撰写帖子等),GET用于检索。您可以使用其他模块,如
querystring
或Express中的参数化路由,从GET请求中的URI提取数据。
export default function(reqData, path, method, onSuccess, onError, onComplete) {
    let xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (xhr.readyState === XMLHttpRequest.DONE) {
            if (xhr.status === 200) {
                if(onSuccess) onSuccess(xhr.responseText != '' ? JSON.parse(xhr.responseText) : '');
            } else {
                if(onError && xhr.responseText != '') {
                    let data = JSON.parse(xhr.responseText);
                    if(data.ExceptionMessage) onError(data.ExceptionMessage);
                }
            }
        }
    };
    let url = window.location.href.replace('#', '') + path;
    xhr.open(method, url);
    xhr.setRequestHeader('Content-Type', 'application/json');
    console.log(JSON.stringify(reqData));
    xhr.send(JSON.stringify(reqData));
    return xhr;
} 
xhr.open(method, url);