使用Node JS读取远程CSV

时间:2017-05-27 16:03:46

标签: javascript node.js csv

我遇到以下问题:我尝试从其他网站读取远程CSV,每当我使用http.get时,我都会收到状态代码410 Gone。 Chrome可以很好地下载,其他网站也可以加载这些CSV。

var options = {
    host: myHost,
    port: 80,
    path: myURL,
    method: 'GET',
    headers: {
        'Content-disposition': 'attachment; filename='someFile.csv',
        'Content-Type': 'text/csv'
    }
};

http.get(options, function(res) {
    var str = '';
    res.on('data', function(chunk) {
        str += chunk;
    });
    res.on('end', function() {
        console.log(str);
    });
});

我尝试使用require,但我得到同样的东西。什么是正确的方法?

1 个答案:

答案 0 :(得分:0)

我不知道这是否是您问题的主要原因,但您发送的标头都不适合GET请求。

Content-disposition是一个回复标题。它只对答案有意义。以下是来自MDN的此标题的说明:

  

在常规HTTP响应中,Content-Disposition响应标头是一个标题,指示是否希望内容在浏览器中内联显示,即作为网页或作为网页的一部分显示,还是作为附件,在本地下载和保存。

Content-type在请求中使用时,描述您随请求一起发送的数据的内容格式。这适用于POST或PUT,但不适用于GET,因为使用GET时,除了请求标头本身和路径之外,您不会发送任何数据。

如果请求想要向服务器发送首选内容类型以获取GET请求,它通常会使用Accept标头列出其首选数据类型,或者它将使用服务器已知支持的查询参数传达所需的数据类型。您可以在this post中看到Content-typeAccept标题的讨论。

如果删除它们没有区别,那么您的GET请求与浏览器发送的内容之间必然存在其他差异。您可以通过检查两个请求来确定有什么不同。如果您控制服务器,那么您可以使用其中一个数据包嗅探器,它将在两种情况下准确显示传入的HTTP请求,您可以直接比较它们。如果您不控制服务器,那么您可以在客户端使用这样的数据包嗅探器并查看两个传出请求。在浏览器中,您可以在浏览器调试器的网络选项卡中查看请求。

4xx错误意味着资源规范出现问题,服务器认为它无法找到匹配的资源。这可能是由于上述两个标头中的一个意外出现而触发的,或者更可能是请求中路径规范的问题。

要检查的另一件事是浏览器是否还向此服务器发送cookie,该cookie可能包含与请求相关的一些其他信息(例如用户名或类似内容)。如果我们能够准确地看到线路上的两个请求中的内容并查看它们之间的差异,我们可以提供更多详细信息。

虽然这可能不是您的情况下发生的情况,但建议使用HTTP错误处理程序:

http.get(options, function(res) {
    var str = '';
    res.on('data', function(chunk) {
        str += chunk;
    });
    res.on('end', function() {
        console.log(str);
    });
}).on('error', function(e) {
    // error sending the request here
    console.log(e);
});