在NodeJS中将远程JS文件作为字符串读取

时间:2016-02-13 12:27:15

标签: javascript node.js macos

我尝试使用http.get检索NodeJS中的远程JS文件 虽然我的浏览器中的文件是可访问和可读的,但我的http.get代码却抛出:

events.js:141
      throw er; // Unhandled 'error' event
      ^

TypeError: Invalid non-string/buffer chunk
    at chunkInvalid (_stream_readable.js:372:10)
    at readableAddChunk (_stream_readable.js:124:12)
    at Socket.Readable.push (_stream_readable.js:110:10)
    at TCP.onread (net.js:523:20)

我尝试过多个库,但都出现了同样的错误(可能大多数只是包装了http.get API)

我发布了我的代码,虽然这是非常基本的。

    var request = http.get("http://nodejs.org/static/js/download.js", function(error, response,body) {
  console.log(body)
});

Mac OS X 10.11.3

上使用节点4.3.0 (5.6.0没有做任何魔法)

谢谢!

1 个答案:

答案 0 :(得分:0)

你的回调错了,试试这样:

var url = "http://nodejs.org/static/js/download.js";

var http = require('http');
http.get(url, function (res) {
    console.log(res.statusCode);

    res.on('data', (chunk) => {
        console.log('BODY: ' + chunk);
    });
    res.on('end', () => {
        console.log('No more data in response.')
    });
}).on('error', (e) => {
    console.log('Got error: ' + e.message);
});

这段代码告诉我:

301
BODY: <html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>

正如您所看到的,http模块非常基本,并且不会遵循重定向,您应该使用更强大的功能,例如request

var request = require('request');    
request.get(url, function (err, res) {
    if (err) console.log(err);
    console.log(res.body); // the output is the javascript code
});

或已宣传的版本request-promise

var request = require('request-promise');
request.get(url).then(function (res) {
    console.log(res);
}).catch(function (err) {
    console.log('Error ' + err.statusCode);
});