Node.js 在nodejs中侦听http服务器时发生Express模块错误

Node.js 在nodejs中侦听http服务器时发生Express模块错误,node.js,express,Node.js,Express,我已经创建了一个nodejshttp服务器 var http = require("http"); var url = require("url"); var express = require('express'); var app = express(); function start(route, handle){ function onRequest(request,response){ var pathname = url.parse(request.url)

我已经创建了一个nodejshttp服务器

var http = require("http");
var url = require("url");
var express = require('express');
var app = express();

function start(route, handle){
    function onRequest(request,response){
        var pathname = url.parse(request.url).pathname;
        console.log("Request for " + pathname + " received.");
        route(handle, pathname, response, request);
    }

    http.createServer(onRequest).listen(8888);
    console.log("Server has started");
    app.listen(8888);
    console.log('Express app listening on port 8888');
}
这是错误的

f:\Labs\nodejs\webapp>node index.js
Server has started
Express app listening on port 8888

events.js:66
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: listen EADDRINUSE
    at errnoException (net.js:769:11)
    at Server._listen2 (net.js:909:14)
    at listen (net.js:936:10)
    at Server.listen (net.js:985:5)
    at Function.app.listen (f:\Labs\nodejs\webapp\node_modules\express\lib\appli
cation.js:532:24)
    at Object.start (f:\Labs\nodejs\webapp\server.js:15:6)
    at Object.<anonymous> (f:\Labs\nodejs\webapp\index.js:11:8)
    at Module._compile (module.js:449:26)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:356:32)
f:\Labs\nodejs\webapp>node index.js
服务器已启动
在8888端口上侦听Express应用程序
events.js:66
抛出参数[1];//未处理的“错误”事件
^
错误:请使用侦听器
在errnoException(net.js:769:11)
在服务器上。\u listen2(net.js:909:14)
听(net.js:936:10)
在Server.listen(net.js:985:5)
在Function.app.listen(f:\Labs\nodejs\webapp\node\u modules\express\lib\appli
(见附件js:532:24)
在Object.start(f:\Labs\nodejs\webapp\server.js:15:6)
反对。(f:\Labs\nodejs\webapp\index.js:11:8)
在模块处编译(Module.js:449:26)
在Object.Module._extensions..js(Module.js:467:10)
在Module.load(Module.js:356:32)
当我更改app.listen的端口时,它不会抛出此错误,该怎么办

更改服务器端口以外的端口是否会将服务器会话保留在另一个端口


我如何在其他js页面中访问此应用程序变量以获取/设置数据?

您不能让多个东西像这样监听同一端口,因此出现
EADDRINUSE
错误。如果要在使用Express时创建自己的http服务器,可以按如下方式执行:

var express = require('express');
var https = require('https');
var http = require('http');
var app = express();

http.createServer(app).listen(8888);
https.createServer(options, app).listen(443);
app.get('/foo/:fooId', function(req, res, next) {
   // get foo and then render a template
   res.render('foo.html', foo);
});
从Express docs:

express()返回的应用程序实际上是一个JavaScript函数, 设计用于作为回调传递到节点的http服务器以处理 请求

或者你也可以这样做

app.listen(8888);

然后Express将为您设置一个
http
服务器

然后,您将在Express中设置路由,以实际处理传入的请求。使用Express时,路线如下所示:

var express = require('express');
var https = require('https');
var http = require('http');
var app = express();

http.createServer(app).listen(8888);
https.createServer(options, app).listen(443);
app.get('/foo/:fooId', function(req, res, next) {
   // get foo and then render a template
   res.render('foo.html', foo);
});
如果你想在其他模块(通常用于测试)中访问你的
应用程序
,你可以像导出任何其他变量一样导出它:

module.exports.app = app;

然后,您将能够在其他模块中
要求('./app')。app

您不能让多个东西在同一端口上侦听,因此出现
EADDRINUSE
错误。如果要在使用Express时创建自己的http服务器,可以按如下方式执行:

var express = require('express');
var https = require('https');
var http = require('http');
var app = express();

http.createServer(app).listen(8888);
https.createServer(options, app).listen(443);
app.get('/foo/:fooId', function(req, res, next) {
   // get foo and then render a template
   res.render('foo.html', foo);
});
从Express docs:

express()返回的应用程序实际上是一个JavaScript函数, 设计用于作为回调传递到节点的http服务器以处理 请求

或者你也可以这样做

app.listen(8888);

然后Express将为您设置一个
http
服务器

然后,您将在Express中设置路由,以实际处理传入的请求。使用Express时,路线如下所示:

var express = require('express');
var https = require('https');
var http = require('http');
var app = express();

http.createServer(app).listen(8888);
https.createServer(options, app).listen(443);
app.get('/foo/:fooId', function(req, res, next) {
   // get foo and then render a template
   res.render('foo.html', foo);
});
如果你想在其他模块(通常用于测试)中访问你的
应用程序
,你可以像导出任何其他变量一样导出它:

module.exports.app = app;

然后,您将能够
在其他模块中要求('./app')。app

如果您打算在同一端口上运行,您可以查看当前是否使用运行节点进程

ps aux| grep节点


然后,
kill-9ProcessId

如果您打算在同一端口上运行,您可以查看当前是否使用运行节点进程

ps aux| grep节点


然后
kill-9processid

,然后Express将为您设置一个http服务器。这条线路实际上解决了我的问题,我不知道express为它创建了另一个服务器。所以实际上问题是,我无意中在同一个端口上创建了两个服务器,这导致了异常。谢谢是的,我不确定您是否真的需要设置自己的http服务器实例(如果您要处理http和https连接,这很有用)。如果您不需要,只需使用
app。听一听
-更简单:),Express就会为您设置一个http服务器。这条线路实际上解决了我的问题,我不知道express为它创建了另一个服务器。所以实际上问题是,我无意中在同一个端口上创建了两个服务器,这导致了异常。谢谢是的,我不确定您是否真的需要设置自己的http服务器实例(如果您要处理http和https连接,这很有用)。如果您不需要,只需使用
应用程序即可。听一听
-更简单:)