http
var http = require('http');
var requestHandler = function(request, response){
response.end('response is over');
};
var serverPort = 8888;
var web = http.createServer(requestHandler);
web.listen(serverPort);
console.log('webServer running on http://localhost:8888');
require('http')
:导入http
模块
requestHandler
:处理方法
response.end
:处理结束标记,返回响应
createServer
:创建服务器并指定处理方法
listen
:指示监听端口
http
是基本模块,express
针对http
进行了封装更多开发采用
express
更多信息可以查询http模块文档。
express
安装
express
是第三方模块,不属于node
的基本模块,需要额外安装。
MaxOS
和Linux
安装node
不一定自带npm
。有可能需要自己手动安装和配置环境变量。
npm install -g express
npm
源不太好用,可以使用cnpm
npm install cnpm -g --registry=https://registry.npm.taobao.org
安装时用
cnpm
,除此之外和npm
用法一致cnpm install -g express
安装好以后注意环境变量配置。
没有配置环境变量不影响基本模块使用,但是新模块存在下载完成导入失败的可能。
NODE_PATH = D:\software\nodejs\node_modules
PATH = PATH;%NODE_PATH%
基本使用
var express = require('express');
var app = express();
app.get('/hello', function(request, response){
response.end('hello world!');
});
var serverPort = 8888;
app.listen(serverPort, function(){
console.log('server running on http://localhost:8888');
});
require('express')
:模块导入
express()
:创建应用
get
:调用方式,指定访问路由,以及处理方法
listener
:指定监听端口和回调函数
访问
http://localhost:8888
失败访问
http://localhost:8888/hello
成功,hello world!
。
- 静态文件
var express = require('express');
var app = express();
app.use(express.static('./static'));
use
:指定使用的中间件
express.static
:使用中间件,并指定静态文件夹
use
使用中间件必须在get
等处理方法之前,否则访问失败。静态文件夹直接访问失败,但是可以直接访问静态文件夹内部文件。
- 路由
var express = require('express');
var app = express();
app.use(express.static('./static'));
var router = express.Router();
router.get('/a', function(request, response){
response.end('this is page a');
});
router.get('/b', function(request, response){
response.end('this is page b');
});
app.use('/page', router);
app.listen(8888, function(){
console.log('server running on http://localhost:8888');
});
get
:指定路径和处理办法
Router
:同样可以指定路由,单路由指定
use
:引进路由中间件,可以进行路由管理
# 访问地址
http://localhost:8888/page/a
http://localhost:8888/page/b
多级路由,可以通过类型,级别进行收纳处理,便于维护。
- 方式
var express = require('express');
var app = expres();
app.route('/route')
.get(function(request, response){
response.end('this is get');
})
.post(function(request, response){
response.end('this is post');
});
app.listen(8888, function(){
console.log('server running on http://localhost:8888');
});
route
:对于同一路径,可以制定不同请求方式的处理办法
# 发起http请求, 默认方式为GET
curl http://localhost:8888/route
# 声明指定提交方式未GET -X 指定提交方式
curl -X GET http://localhost:8888/route
# 声明指定提交方式为POST
curl -X POST http://localhost:8888/route
- 综合
var express = require('express');
var app = express();
var staticFilePath = './static';
// 静态文件
app.use(express.static(staticFilePath));
// 直接路径
app.get('/index', function(request, response){
response.end('this is index');
});
// route 同路径,多提交方式处理
app.route('/route')
.get(function(request, response){
response.end('this is route.get');
})
.post(function(request, response){
response.end('this is route.post');
});
var router = express.Router();
// 路由收纳, 可用route多提交方式处理
router.route('/route')
.get(function(request, response){
response.end('this is router.route.get');
})
.post(function(request, response){
response.end('this is router.route.post');
});
// 添加路由管理
app.use('/router', router);
app.listen(8888, function(request, response){
console.log('server running on http://localhost:8888');
});
- 静态文件
- 路径设置
- 路由管理
- 多方式处理
后两种随意组合
- 参数获取
- 路径参数
var express require('express');
var app = express();
app.param('name', function(request, response, next, name){
console.log('receive name ' + name);
request.name = name;
cosole.log('set name into request');
next();
console.log('do next');
});
app.get('/param/:name', function(request, response){
response.end('get name from request: ' + request.name);
});
app.listen(8888, function(){
console.log('server running on http://localhost:8888');
});
param
:指定拦截参数的处理办法
request
:请求
response
:响应
next
:继续,放行,相当于java
过滤器中的doFilter
name
:参数的具体传输值
/param/:name
:需提取的路径参数用:param
的形式进行声明,设置的param
方法会自动拦截处理。
# 访问路径
http://localhost:8888/param/godme
param
app.get('/param', function(request, response){
response.end('get name from request: ' + response.query.name);
});
// GET POST 都可以
# 访问路径
http://localhost/param?name=godme
body
var express = require('express');
var parser = require('body-parser');
var urlEncodedParser = parser.urlencoded({extended:false});
var jsonParser = parser.json()
var app = express();
app.use(urlEncodedParser);
app.use(jsonParser);
app.post('/param', function(request, response){
console.log('body: ' + request.body);
response.end('receive name : ' + request.body.name);
})
直接访问,携带参数
{name : godme}
。
- 日志
var morgan = require('morgan');
app.use(morgan());
morgan
:日志模块
socket
server
const net = require('net');
const host = '127.0.0.1';
const port = 8888;
var server = net.createServer(function(socket){
console.log('connect success', socket.remoteAddress, socket.remotePort);
socket.on('data', function(data){
console.log('receive from ', socker.remoteAddress, socket.remotePort);
console.log('receive data ', data.toString());
socket.write('nice , i am godme too !');
});
});
server.listen(port, host, function(){
console.log('tcp server running on tcp://', host, port);
})
net
:tcp
链接模块
const
:导入的模块和特定变量,用const
定义常量比较保险
createServer
:创建server
并设定回调函数
socket
:server
实际上就是socket
管理器,具体操作在socket
上进行设置
on
:socket
都是事件驱动,绑定特定事件并设置回调函数
write
:socket
写数据
listen
:监听,并设置回调函数
data
:tcp
传输都是二进制字节,对应对象为buffer
,想显示字符串需要toString
client
const net = require('net');
const host = '127.0.0.1';
const port = 8888;
var client = net.Socket();
client.on('data', function(data){
console.log('receive from server:', data.toString());
})
client.connect(port, host, function(){
console.log('connect to server', host, port);
client.write('hello , i am godme!');
})
connect
:发起连接动作。
port-host
:比较怪异,先端口后地址,切记
总的来说,都是
socket
的调用。
- 管理
服务端作为
socket
的管理,因为可能面临多个链接。
- 事件
通过事件设定触发操作,具体围绕
socket
。
- 角色
服务器自动创建和管理
socket
,设定好动作即可。客户端相当于就是一个
socket
,免去管理的问题。
更多方法可以参看文档。