Javascript AJAX调用未收到来自Web服务器的响应

Javascript AJAX调用未收到来自Web服务器的响应,javascript,ajax,node.js,Javascript,Ajax,Node.js,我看过相关的问题,但没有一个对我有帮助。因此,我提出了这个问题 因此,我的客户端解密URL并将其发送到我的服务器,然后服务器解密URL并使用解密的请求进行API调用。在服务器端,一切似乎都很正常。没有抛出任何错误。原木看起来不错等等 我的AJAX看起来像: var handleRequest = function(request){ $.ajax({ type: "GET", url: host + '/requests?call=' + request,

我看过相关的问题,但没有一个对我有帮助。因此,我提出了这个问题

因此,我的客户端解密URL并将其发送到我的服务器,然后服务器解密URL并使用解密的请求进行API调用。在服务器端,一切似乎都很正常。没有抛出任何错误。原木看起来不错等等

我的AJAX看起来像:

var handleRequest = function(request){
    $.ajax({
        type: "GET",
        url: host + '/requests?call=' + request,
        success: function(data) {
        var rawJSON = JSON.stringify(data, null, 2);
        console.log('Recieved: ' + rawJSON);
        editor.setValue(rawJSON);
       },
       error: function(jqXHR, responseText,status){
            console.log(jqXHR.responseText)
       },
       dataType: 'jsonp'
    });
}
服务器端:

app.get('/requests', function(req, res) {
    var call = req.query.call;
    var decryptedRequest = decryptRequest(call);
    console.log("Recieved: " + decryptedRequest);

    var rawJson = retriever.makeExternalCall(decryptedRequest);
    console.log('Sending response to client');

    res.setHeader('Content-Type', 'application/json');
    res.send(rawJson);
});
上述方法:

var requestService = require('request');

module.exports = {
    makeExternalCall: function(url) {
        console.log('Making call to: ' + url);
        requestService(url, function(error, response, body){
            console.log(body);
            return body;
        });
    }
}
奇怪的是当我替换

res.send(rawJson);


我得到了答复。有什么想法吗?

函数
makeExternalCall
是一个异步函数。从回调返回不起作用,因为异步函数在返回数据之前已经返回,因此
rawJson
未定义

解决方法是正确使用回调函数

var requestService = require('request');

module.exports = {
    makeExternalCall: function(url,callback) {
        console.log('Making call to: ' + url);
        requestService(url, callback);
    }
}
然后在API处理程序中

app.get('/requests', function(req, res) {
    var call = req.query.call;
    var decryptedRequest = decryptRequest(call);
    console.log("Recieved: " + decryptedRequest);

    retriever.makeExternalCall(decryptedRequest, function(error, response, body) {
        if (error) {
            res.send("error message");
        } else {
            res.setHeader('Content-Type', 'application/json');
            res.send(body);
        }
    })
});

makeExternalCall
函数不返回任何内容。这意味着
rawJson
未定义。这是一个非常常见的问题:Hmmm的可能重复,这是我已经解决过的一个问题,尽管我提到了@ChrisG。我不是函数式编程出身,所以这是我的新手错误。我想我可以直接返回函数?(解决方案是将
res.send()
移动到当前具有
返回正文的位置;
)在请求处理程序中发送响应不是一种好做法吗。i、 e.应用程序获取(…)?
app.get('/requests', function(req, res) {
    var call = req.query.call;
    var decryptedRequest = decryptRequest(call);
    console.log("Recieved: " + decryptedRequest);

    retriever.makeExternalCall(decryptedRequest, function(error, response, body) {
        if (error) {
            res.send("error message");
        } else {
            res.setHeader('Content-Type', 'application/json');
            res.send(body);
        }
    })
});