【问题标题】:Need to understand how node.js has to be configured to return a javascript library需要了解如何将 node.js 配置为返回一个 javascript 库
【发布时间】:2014-03-30 22:08:06
【问题描述】:

新手问题。我的浏览器抛出异常:

“资源被解释为脚本,但使用 MIME 类型 text/html 传输:"http://localhost:9090/d3/d3.min.js"。未捕获的 SyntaxError: Unexpected token

我的代码有两个库,socket.io 和 d3。 Node 将 socket.io 库返回给浏览器,但是当请求 d3 时,node 会返回网页。我显然不明白如何配置东西来完成这项工作。 (为什么 node 知道如何服务 socket.io 而不是 d3?)谢谢!

代码如下:

test_app.js:

var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , fs = require('fs')
  , watch = require('watch')
  , d3 = require('d3')

app.listen(9090);

function handler (req, res) {
  fs.readFile(__dirname + '/test_socket.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading the html file');
    }
    //res.writeHead(200);
    res.writeHead(200,{'Content-Type':'text/html'});
    res.end(data);
  });
}

test_socket.html:

<html>
<head>
<script type="text/javascript" src="/socket.io/socket.io.js"></script>
<script type="text/javascript" src="../d3/d3.min.js"></script> 
</head>

<script>
  var socket = io.connect('http://localhost:9090');
  socket.on('hi there now', function (data) {  // message received from server
    console.log(data);
    socket.emit('my other event', { my: 'data' });  // talk back to server?
  });
</script>

<body>hello</body>
</html>

【问题讨论】:

  • 使用浏览器网络控制台查看实际的 HTTP 响应是什么样的。它可能是 404 页面或其他内容。
  • 谢谢,好主意,但它是 200
  • 好的,但是响应的实际内容是什么?
  • 好的,你的问题有帮助。我检查了对 d3 请求的响应内容,它不是库,而是实际的网页(test_socket.html)。我已经相应地编辑了我的问题。谢谢。

标签: javascript node.js d3.js socket.io


【解决方案1】:

我打赌实际响应包含您的 test_socket.html 的内容。问题是加载javascript文件没有异常规则,服务器总是通过发送test_socket.html来响应请求。但是,socket.io javscript 文件可以工作,因为 socket.io 本身会拦截此请求并为 socketio.js 文件提供服务(在您的控制台中查看,它应该显示“提供静态内容 socket.io”或类似的内容)

我发现让预构建的框架来处理这类问题要容易得多。 看看http://code.tutsplus.com/tutorials/using-nodejs-and-websockets-to-build-a-chat-service--net-34482。这是我上手的教程,向你介绍了node.js、npm、express、jade和socket.io。应该可以很好地帮助您开始构建您的第一个 Web 2.0 应用程序!

【讨论】:

  • 是的,你是对的,它返回的是 html 页面的内容。我不知道 socket.io 的“魔法”。我会试试你的建议。
  • 这并不是真正的魔法。原因是他们也使用相同的 url (domain.com/socketio.js) 来路由他们的通信。他们所做的只是拦截对该地址的任何请求,以便他们能够正确处理它。如果它只是对那个特定 url 的请求,没有添加任何与通信相关的数据,它会理解正在请求 javascript 文件本身,因此它很乐意为它服务。无论如何,祝你的应用好运!
  • 我不知道如何编写您提到的“异常规则”,因为 socket.io 似乎在一个示例之外基本上没有文档。我在这方面非常接近并且花了很多时间,以至于把它全部扔掉并重新开始学习 Express 似乎很疯狂。这是一个重要但一次性的演示,因此它不需要具有生产质量的设计模式或代码。
  • Express 为此提供了一些功能,您可以在其中指定路线并创建一个“公共”目录,一个放置您的 css 和 javascript 文件的地方。对这个“公共”目录发出的任何请求,都只是提供给请求的文件,而不是正常的 test/html 响应。在您快速而肮脏的方法中,您将不得不按照以下方式做一些事情:robsearles.com/2010/05/nodejs-tutorial-part-2-routing。 IE。您为 javascript 文件创建特定路由,然后分别获取并返回该文件。
猜你喜欢
  • 2013-04-09
  • 2015-07-22
  • 2021-12-23
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多