1

我创建了一个 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 变量以获取/设置数据?

4

2 回答 2

3

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

ps aux | grep node

进而kill -9 PROCESSID

于 2013-03-25T02:09:05.633 回答
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() 返回的应用程序实际上是一个 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在其他模块中。

于 2012-09-22T16:31:48.670 回答