Answers:
Express 4.x答案:
Express 4.x(根据下面的Tien Do回答)现在将app.listen()视为异步操作,因此listener.address()将仅在app.listen()的回调内部返回数据:
var app = require('express')();
var listener = app.listen(8888, function(){
console.log('Listening on port ' + listener.address().port); //Listening on port 8888
});
快递3答案:
我认为您正在寻找这个(特定于表达?):
console.log("Express server listening on port %d", app.address().port)
通过express
命令创建目录结构时,您可能已经看到了这一点(下一行):
alfred@alfred-laptop:~/node$ express test4
create : test4
create : test4/app.js
create : test4/public/images
create : test4/public/javascripts
create : test4/logs
create : test4/pids
create : test4/public/stylesheets
create : test4/public/stylesheets/style.less
create : test4/views/partials
create : test4/views/layout.jade
create : test4/views/index.jade
create : test4/test
create : test4/test/app.test.js
alfred@alfred-laptop:~/node$ cat test4/app.js
/**
* Module dependencies.
*/
var express = require('express');
var app = module.exports = express.createServer();
// Configuration
app.configure(function(){
app.set('views', __dirname + '/views');
app.use(express.bodyDecoder());
app.use(express.methodOverride());
app.use(express.compiler({ src: __dirname + '/public', enable: ['less'] }));
app.use(app.router);
app.use(express.staticProvider(__dirname + '/public'));
});
app.configure('development', function(){
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
app.configure('production', function(){
app.use(express.errorHandler());
});
// Routes
app.get('/', function(req, res){
res.render('index.jade', {
locals: {
title: 'Express'
}
});
});
// Only listen on $ node app.js
if (!module.parent) {
app.listen(3000);
console.log("Express server listening on port %d", app.address().port)
}
var listener
,则可以this.address().port
在app.listen()
回调内部使用
this.address.port()
但不能在箭头函数中使用它。您将需要上旧学校app.listen(8000, function () { console.log('http://localhost:' + this.address().port); }
(是的,我知道反引号会更好,但我不能在堆栈溢出注释中这样做)
在Express v3.0中,
/* No longer valid */
var app = express.createServer();
app.listen();
console.log('Server running on %s', app.address().port);
不再有效!对于Express v3.0,您应该通过以下方式创建应用和服务器:
var express = require('express');
var http = require('http');
var app = express();
var server = http.createServer(app);
app.get('/', function(req, res) {
res.send("Hello World!");
});
server.listen(3000);
console.log('Express server started on port %s', server.address().port);
我自己遇到了这个问题,想记录新的语法。Express v3.0中的此更改和其他更改在https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x中可见
0
给server.listen()
,则很有用,在这种情况下,将分配一个随机端口号。如果您在一台服务器上运行多个Express应用程序,并且不想手动分配端口号,则可以执行此操作。
app.listen()
还返回http服务器实例。
在当前版本(v0.5.0-pre)中,该端口似乎可以作为服务器对象上的属性使用,请参见http://nodejs.org/docs/v0.4.7/api/net.html#server.address
var server = http.createServer(function(req, res) {
...
}
server.listen(8088);
console.log(server.address());
console.log(server.address().address);
console.log(server.address().port);
输出
{ address: '0.0.0.0', port: 8088 }
0.0.0.0
8088
不需要http模块。
http
在Express 3或4中不需要额外导入。分配结果listen()
就足够了。
var server = require('express')();
server.get('/', function(req, res) {
res.send("Hello Foo!");
});
var listener = server.listen(3000);
console.log('Your friendly Express server, listening on port %s', listener.address().port);
// Your friendly Express server, listening on port 3000
同样,这已在Express 3.5.1&4.0.0中进行了测试。http
从来没有必要导入。listen方法返回一个http服务器对象。
https://github.com/visionmedia/express/blob/master/lib/application.js#L531
使用最新的node.js(v0.3.8-pre):我检查了文档,检查了http.createServer()返回的服务器实例,并阅读了server.listen()的源代码...
可悲的是,端口仅作为本地变量临时存储,并最终作为对本机方法process.binding('net')。bind()的调用中的参数而结束。我没有进一步看。
似乎没有比保留对您提供给server.listen()的端口值的引用更好的方法了。
我也问自己这个问题,然后我来到Express 4.x指南页面查看此示例:
var server = app.listen(3000, function() {
console.log('Listening on port %d', server.address().port);
});
您可以使用server.address().port
以下代码中的like 来获取端口号:
var http = require('http');
var serverFunction = function (req, res) {
if (req.url == '/') {
console.log('get method');
res.writeHead(200, { 'content-type': 'text/plain' });
res.end('Hello World');
}
}
var server = http.createServer(serverFunction);
server.listen(3002, function () {
console.log('server is listening on port:', server.address().port);
});
在findandbind
NPM解决了这个快递/的RESTify /连接:https://github.com/gyllstromk/node-find-and-bind
下面的简单http服务器以及如何获取监听端口
var http = require("http");
function onRequest(request, response) {
console.log("Request received.");
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}
var server =http.createServer(onRequest).listen(process.env.PORT, function(){
console.log('Listening on port '); //Listening on port 8888
});
然后使用以下命令获取服务器端口:
console.log('Express server started on port %s', server.address().port);
const express = require('express');
const morgan = require('morgan')
const PORT = 3000;
morgan.token('port', (req) => {
return req.app.locals.port;
});
const app = express();
app.locals.port = PORT;
app.use(morgan(':method :url :port'))
app.get('/app', function(req, res) {
res.send("Hello world from server");
});
app1.listen(PORT);
更简单的方法是调用app.get('url')
,它为您提供了协议,子域,域和端口。
req.headers.host