异步Javascript请求问题(节点,请求承诺模块)

时间:2016-09-14 22:15:54

标签: javascript node.js promise

我正在构建一个应用程序,并且遇到了从客户端发出请求,将其发送到我的服务器,让服务器进行API调用然后将结果发送回客户端的问题。我正在使用Node和Request-Promise模块。

以下是客户端代码:

OrderBy()

这成功向服务器发出请求:

$(document).ready(function() {
    var artistSearch = () => {
        const q = $('.artistName').val();
        $.ajax({
            type: "POST",
            url: "http://localhost:3000/request",
            data: {artist: q},
        })
        .done(function(data) {
            console.log('data: ', data)
        })
    };

    $(".artistSearch").submit( () => {
        artistSearch();
    });
});

});

最终成功地从API调用中获取数据,但从未将其发送回客户端!如果我在我的.then承诺之外做res.send(),我可以在客户端接收数据。

我有什么遗失的吗?提前谢谢!

2 个答案:

答案 0 :(得分:0)

试试这个     

var options = {
    uri: searchURL,
    simple: false,
};

rp(options)
    .then(function (data) {
        console.log(data);
        res.status(200).send(data).end();
    })
    .then(function() {
        console.log('complete');
    })
    .catch(function (err) {
        console.log('error') 
    });

答案 1 :(得分:0)

我认为客户端确实收到了数据,但连接没有正确终止,因为它认为有更多数据。这是因为你没有指定标题,而模块http无法计算出内容长度。

rp(options)
    .then(function (data) {
        console.log(data);
        // res.send(data);

        // assume data is JSON.  
        res.setHeader (200, {'Content-Type': 'application/json', 
                             'Content-Length':data.byteLength});
        res.end(data);  //Send data immediately.
    })

...

如果data是字符串,则需要使用data.length。实际上,如果data是一个字符串,那么默认情况下标题是{'Content-Type': 'application/json', 'Content-Length':data.length}