在nodejs中侦听http服务器时出现模块错误

时间:2012-09-22 16:01:46

标签: node.js express

我创建了一个nodejs http服务器

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)

当我更改app.listen的端口时,它不会抛出此错误,可以做什么?

更改服务器端口以外的端口会将服务器的会话保持在另一个端口上吗?

如何在其他js页面中访问此app变量来获取/设置数据?

2 个答案:

答案 0 :(得分:2)

你不能像这样在同一个端口上监听多个事情,因此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);

来自Express文档:

  

express()返回的app实际上是一个JavaScript函数,   旨在作为要处理的回调传递给节点的http服务器   请求。

或者你可以做到

app.listen(8888);

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

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

app.get('/foo/:fooId', function(req, res, next) {
   // get foo and then render a template
   res.render('foo.html', foo);
});

如果您想访问其他模块中的app(通常用于测试),您可以像其他任何变量一样将其导出:

module.exports.app = app;

然后,您就可以在其他模块中require('./app').app

答案 1 :(得分:2)

如果您打算在同一端口上运行,可以查看当前是否正在运行带

的节点进程

ps aux | grep node

然后kill -9 PROCESSID