小生愛

实例1 : 创建nodeJS服务器

实例2 : 导出模版 加载url模块 路由器模块

实例3 : 创建请求处理模块

实例4 : 自定义模块

实例5 : nodeJs进程测试

实例6 : nextTick方法

实例7 : 重写exports属性

实例8 : 获取当前目录文件列表

实例9 : 流的概念

实例10 : 列出目录文件 等待用户输入

实例11 : 命令行文件浏览器

实例12 : 为一个文件创建一个可读的Stream对象

实例13 : 监听文件或目录是否发生变化

实例14 : TCP服务器(练习一)

实例15 : HTTP服务器

实例16 : 服务器间的通信步骤一

实例17 : 简单的web开发 实例一

实例18 : connect 实例一

// nodeJS 实例一 创建服务器_________________________________________________________________________ // 调用require方法 // 创建一个http对象 // require是Node自带的一个模块 var http = require('http'); // 创建服务器 var server = http.createServer(function (request, response){ response.writeHead(200, {'Content-Type':'text/plain'}); // 回调函数 // 当该服务器收到请求时 执行该回调函数 // 输出内容必须是字符串 response.write('2222'); console.log('服务器被请求时 执行该输出到node命令行界面'); response.end(); }); // 指定这个HTTP服务器监听的端口号 server.listen(8888); console.log('创建服务器时 执行该输出'); // nodeJS 实例二 导出nodeJs模块_________________________________________________________________________ // server.js 模块 // 调用require方法 // 创建一个http对象 var http = require('http'); // 加载url模块 var url = require('url'); var start = function (route){ // 创建服务器 var server = http.createServer(function (request, response){ var json = url.parse(request.url); // 获取path路径 var pathname = json.pathname; response.writeHead(200, '{"Content-Type":"text/plain"}'); // 调用路由方法 // json.query 返回?后的所有参数 route.route(pathname, json.query); // 标注响应完成 response.end(); }); // 指定这个HTTP服务器监听的端口号 server.listen(8888); }; // 导出nodeJs模块 exports.start = start; // nodeJS 实例三 创建请求处理模块_________________________________________________________________________ // index.js 主程序 // 加载server模块 var server = require('./server'); // 加载路由器模块 var route = require('./router'); // 加载请求处理程序 var requestHandlers = require('./requestHandlers'); // 创建一个对象 // 根据参数保存请求处理程序对应的方法 var obj = {}; obj['/'] = requestHandlers.start; obj['/start'] = requestHandlers.start; obj['/upload'] = requestHandlers.upload; server.start(route, obj); // server.js 服务器模块 // 调用require方法 // 创建一个http对象 var http = require('http'); // 加载url模块 var url = require('url'); var start = function (route, obj){ // 创建服务器 var server = http.createServer(function (request, response){ var json = url.parse(request.url); // 获取path路径 var pathname = json.pathname; response.writeHead(200, '{"Content-Type":"text/plain"}'); // 调用路由方法 // 把obj请求处理程序的对象传递给路由器 route.route(pathname, obj); // 标注响应完成 response.end(); }); // 指定这个HTTP服务器监听的端口号 server.listen(8888); }; // 导出nodeJs模块 exports.start = start; // router.js 路由器模块 // obj 请求处理程序的对象 var route = function (pathname, obj){ if(typeof obj[pathname] === 'function'){ // 根据路由的参数调用相应的处理程序 obj[pathname](); }else{ console.log('Error'); } }; // 导出该模块为node模块 exports.route = route; // requestHandlers.js 请求处理模块 // 根据路由创建的处理程序 var start = function (){ console.log('start'); }; // 根据路由创建的处理程序 var upload = function (){ console.log('upload'); }; // 导出这2个方法 exports.start = start; exports.upload = upload; // nodeJS 实例四 自定义模块_________________________________________________________________________ // name 自定义模块名 (可以不写) // version 自定义版本号 (可以不写) // dependencies 依赖的模块 // 运行npm install 将安装这里定义的所有模块 { "name" : "my file", "version" : "0.0.4", "dependencies" : { "colors" : "0.5.0", "formidable" : "" } } // nodeJS 实例五 测试node进程_________________________________________________________________________ // node采用一个长期运行的进程 当用户多次请求时 // 只有第一次arr有值 以后就没有值了 // 因为再请求时只会调用回调函数 而不会再重新定义arr // 加载http模块 var http = require('http'); var arr = [1,2]; // 创建服务器 var server = http.createServer(function (request, response){ // 如果arr有值输出1 // 否则输出2 if(arr.length){ console.log(1); }else{ console.log(2); } // 把数组清空 arr = []; response.end(); }); server.listen(8888); // nodeJS 实例六 nextTick方法_________________________________________________________________________ console.log(1); // nextTick 作用 类似setTimeout process.nextTick(function (){ console.log(3); }); console.log(2); // nodeJS 实例七 重写exports_________________________________________________________________________ // 重写exports // A.js function Person(){ }; Person.prototype = { name : '小生爱', say : function (){ console.log(1111); } }; // 重写exports module.exports = Person; // B.js var p = require('./A'); // 调用类p的say方法 // 此时的p已经是一个函数了 因为被重写了 new p().say(); // nodeJS 实例八 获取当前目录文件列表_________________________________________________________________________ // 加载文件管理模块 var fs = require('fs'); // 同步获取文件列表 console.log(fs.readdirSync(__dirname)); // 异步获取文件列表 // err 错误对象 // files 文件数组 fs.readdir(__dirname, function (err, files){ console.log(files); }); // nodeJS 实例九 流的例子_________________________________________________________________________ // console 会在字符后面输出 \n console.log('AB'); console.log('BC'); // stdout 不会在字符后面输出 \n process.stdout.write('AB'); process.stdout.write('BC'); // nodeJS 实例十 列出当前目录文件 然后等待用户输入_________________________________________________________________________ // 加载文件模块 var fs = require('fs'); // 异步获取当前目录文件列表 // process.cwd() 输出当前目录 fs.readdir(process.cwd(), function (err, files){ // 获取文件数量 if(!files.length){ console.log(' \033[31m error \033[39m\n'); } function file(i){ // 获取文件名 var filename = files[i]; // fs.stat事件 获取文件或目录的元数据 // __dirname 获取当前目录 fs.stat(__dirname + '/' + filename, function (err, stat){ // 判断是否系目录 if(stat.isDirectory()){ console.log(' ' + i + ' \033[36m' + filename + '\033[39m'); }else{ console.log(' ' + i + '\033[90m' + filename + '\033[39m'); } i++; // 如果循环到最后一个文件 if(i==files.length){ // 输出文本流 process.stdout.write(' \033[33m over \033[39m'); // 等待用户输入 process.stdin.resume(); // 设置用户编码 // 用户可以输入特殊字符 process.stdin.setEncoding('utf8'); }else{ file(i); } }); }; file(0); }); // nodeJS 实例十一 命令行文件浏览器_________________________________________________________________________ // 加载文件模块 var fs = require('fs'); var stdin = process.stdin; var stdout = process.stdout; // 保存已读的文件 var savaFiles; // 保存元数据 var statFiles = []; // 用户输入 var read = function (){ // 输出文本流 stdout.write(' \033[33m Over \033[39m'); // 等待用户输入 stdin.resume(); // 设置编码 用户可以输入特殊字符 stdin.setEncoding('utf8'); // 监听用户输入事件 stdin.on('data', option); }; var option = function (data){ stdin.pause(); // 检查用户输入是否匹配文件下标 // Number 转换数字 var filename = savaFiles[Number(data)]; if(!filename) return false; // 判断是否是目录 if(statFiles[Number(data)].isDirectory()){ fs.readdir(process.cwd() + '/' + filename, function (err, files){ for(var i=0, length=files.length; i', '

My form

', '', '

name

', '', '

', '' ].join('')); }else if('/url'==req.url && 'POST'==req.method){ var body = ''; // 监听用户请求信息 req.on('data', function (chunk){ body += chunk; }); req.on('end', function (){ // 定义响应头信息 res.writeHead(200, {'Content-Type':'text/html'}); // req.headers 包含所有请求信息 // req.headers['content-type'] 请求头信息 res.end('

Content-Type:' + qs.parse(body).name + '

'); }); }else{ res.writeHead(404); res.end('Not found!'); } }).listen(3000); // nodeJS 实例十五 服务器之间的通信_________________________________________________________________________ // 创建HTTP服务器 [index.js] var http = require('http'); var qs = require('querystring'); http.createServer(function (req, res){ var body = ''; req.setEncoding('utf8'); console.log(req.url); req.on('data', function (chunk){ body += chunk; console.log(chunk, '--'); }); req.on('end', function (){ res.writeHead(200); res.end('Done'); console.log(qs.parse(body).name); }); }).listen(3000); // 用HTTP对象创建Client对象 [user.js] var http = require('http'); var qs = require('querystring'); var send = function (theName){ http.request({ host : '127.0.0.1', port : 3000, url : '/age', // 这里必须使用POST method : 'POST' // GET方式传参 通过request.url获取 // path : '/xxx' }, function (res){ res.setEncoding('utf8'); var body = ''; // 监听服务器返回数据 // res参数与创建服务器的res参数不同 是另外的一个对象 // data事件 与 end事件必须成对出现 res.on('data', function (chunk){ console.log(chunk, '++'); }); // 监听服务器数据传递完成 res.on('end', function (){ console.log('name: '); }); // 参数通过end传递给服务器 // qs.stringify把参数转换成JSON格式 // 该方式是POST传参 }).end(qs.stringify({name:theName})); }; process.stdout.write('\n you name:'); process.stdin.resume(); process.stdin.setEncoding('utf8'); // 监听输入流 既回车事件 process.stdin.on('data', function (name){ // 用户回车后 调用send请求服务器 // 把用户输入传递给服务器 send(name); }); // nodeJS 实例十六 简单的web应用_________________________________________________________________________ // 通过url请求读取相应文件 返回给浏览器 // 读取到的图片数据 也是通过write返回给浏览器 var http = require('http'); var fs = require('fs'); var server = http.createServer(function (req, res){ var serve = function (path, type){ // 定义请求头 res.writeHead(200, {'Content-Type':type}); // 读取文件 并输出 // 等价于监听 data 与 end 事件 fs.createReadStream(path).pipe(res); }; // 如果请求的是图片 if('GET'==req.method && req.url.substr(0, 7)=='/images' && req.url.substr(-4)=='.jpg'){ // 获取文件元数据 fs.stat(__dirname + req.url, function (err, stat){ // 判断是否是文件 // 如果是文件退出 if(err || !stat.isFile()){ res.writeHead(404); res.end('Not'); return; } }); // 如果不是目录 则读取文件 serve(__dirname + req.url, 'application/jpg'); }else if('GET'==req.method && '/'==req.url){ serve(__dirname + '/index1.html', 'text/html'); }else{ res.writeHead(404); res.end('Not'); } }); server.listen(3000); // nodeJS 实例十七 connect实例一_________________________________________________________________________ // 加载connect模块 var connect = require('connect'); var app = connect(); // 输出日志的中间件 var logger = function (req, res, next){ console.log('%s %s', req.method, req.url); // 调用下一个中间件 next(); }; // 响应HTTP请求的中间件 // 响应HTTP请求的中间件中不能有next方法 var hello = function (req, res){ res.setHeader('Content-Type', 'text/plain'); res.end('hello'); }; // 判断是否是BASIC认证的中间件 var restrict = function (req, res, next){ var authorization = req.headers.authorization; if(!authorization) return next(new Error('abc')); // 认证通过 正常调用下一个中间件 next(); }; // /admin 挂载 标识只有包含/admin时才会执行 restrict这个中间件 app.use('/admin', restrict); // 调用logger中间件 app.use(logger); // 调用hello中间件 app.use(hello); app.listen(3000);