nodejs webserver" undefined不是一个函数"

时间:2015-03-03 11:40:13

标签: javascript node.js webserver

我正在阅读一本书(专业Angularjs)的教程,并且在设置nodejs网络服务器时遇到了一些麻烦。

就像在我所描述的书中一样,我使用以下server.js来创建它:

var connect = require('connect');
connect.createServer(connect.static("../angularjs")).listen(5000);

当我尝试使用"节点server.js"启动服务器时我收到错误:

C:\Programme\nodejs>node server.js
C:\Program Files\nodejs\server.js:2
connect.createServer(connect.static("../angularjs")).listen(5000);
                                   ^
TypeError: undefined is not a function
    at Object.<anonymous> (C:\Program Files\nodejs\server.js:2:36)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
    at node.js:814:3

非常感谢任何帮助,

问候, 基督教

2 个答案:

答案 0 :(得分:4)

试试吧

var connect = require('connect');
var app = connect();
app.listen(5000,function(){
    console.log('listen on 5k port');
})
app.use('../angularjs', function(req, res){
})

答案 1 :(得分:3)

您收到此错误的原因是您致电:

connect.static("../angularjs")

您没有要引用的有效连接服务器实例,因为它是在您致电时创建的:

connect.createServer(...).listen(5000);

在致电connect.createServer()之前,connect是对函数的引用,而不是具有.static()函数的服务器实例。

您需要在调用其任何函数之前创建服务器实例,如:

var server=connect.createServer(); // now connect is a server instance

server.static('../angularjs');

server.listen(5000);

有关连接的详情,请参阅senchalabs/connect github repo

更新

从connect@3.3.5开始,connect不再导出createServer()函数。相反,connect的实际导出是createServer函数本身。

所以不要打电话:

var server=connect.createServer();
你应该致电:

var server=connect();

将返回与上一次调用相同的结果。

3.X.X版本中另一个( big )更改连接是将其中间件组件提取到单独的模块中。这就是调用connect.static()将不再有效的原因。

有两种方法可以解决您当前的问题:

首先,假设你仍然想要探索你现在有点过时的例子,预订,因为它们已被编写,你可以npm install connect@2.29.1将你当前版本的连接恢复为新内部重组发生前的最后一个稳定版本。执行此操作后,本书中的示例应与宣传的一样。

或者,您可以通过安装所需的模块(使用npm install serve-static)并对代码进行以下更改来重构您的示例以使用新的模块化中间件模块:

var connect=require('connect'),
    serveStatic=require('serve-static');

var server=connect();

server.use(serveStatic('../angular.js'));

server.listen(5000);

有关现在模块化的中间件组件的列表,请参阅Connect Middleware

我的建议是理解为什么连接的维护者决定将其中间件组件移动到单独的模块中(提示:连接变得庞大且笨重,因此为了减小其大小和复杂性,决定删除所有用户不需要的部分,并将它们移动到自己的模块中,从而使它们成为&#34;可选&#34; )以及如何使用我在上面概述的相同策略。

这项额外努力的价值在于,一旦您完成了本书并了解如何有效地使用连接,您就不会需要重新学习&#34;从新版本的角度来看。