sublime配置安装
EventEmitter 提供了多个属性,如 on 和 emit。on 函数用于绑定事件函数,emit 属性用于触发一个事件。
Buffer类:
javaScript只有字符串数据类型,没有二进制。处理TCP流或者文件流时,需要二进制数据,所以定义了Buffer类,作为专门存放二进制数据的缓存区。
用一下功能,并没有测试对错 var a = new BUffer(50).write("hello doubi", 0, 12, 'utf8'); var b = a.toString('utf8', 1, 3); var c = buf.toJSON(Buffer.concat(a, b)); var d = a.compare(b); var e = buf.copy(a, 1, 1, 2); slice length..
Stream:抽象接口,比如对http服务器发起请求的Request对象,比如stdout。
Stream有可读操作、可写操作、可读可写操作、操作被写入数据读出结果四种流类型。
都是EventEmitter的实例,常见事件有data、end、error、finish四种事件
eg:createReadStream、createWriteStream、createGzip、createGunzip
模块: 使文件相互调用,使nodejs的基本组成,模块与文件一一对应,比如js文件、json、编译过的c/c++扩展
//注意引用一致 var a = require('./hello'); hello = new a();
两种用法
提供访问接口 hello.js: exports.Hello = function(){}; test1.js: require('hello').hello(); 提供封装对象 hello.js Hello = function(){}; module.exports = hello; test1.js: var a = require('./hello'); var b = new Hello();
模块加载优先级:读缓存 > 读原生模块 > 读扩展名载入文件模块(包装编译,读取后载入缓存)
函数:
1、实现函数、接口函数,调用 function say(str) { console.log(str); } function execute(func, value) { func(value); } execute(say, "Hello"); 2、接口函数匿名,当场调用 function excute(func, val){ func(val); }; excute(function(str) { console.log(str); }, 'hello');
路由router:
比较难懂待完成
向路由提供请求的URL和GET及POST参数, 路由据此执行代码。 所有数据包含在request对象中,也即onRequest()回调函数的第一个参数。 解析数据,用到url和querystring模块。 url.parse(string).query | url.parse(string).pathname | | | | | ------ ------------------- http://localhost:8888/start?foo=bar&hello=world --- ----- | | | | querystring(string)["foo"] | | querystring(string)["hello"]
Global全局对象:
//1 console.log( __filename); console.log( __dirname); function Hello() { console.log("hi world!"); } console.time("在我弟盼着"); Hello(); console.timeEnd("在我弟盼着"); console.info("程序结束 "); console.trace();//打印堆栈消息 // console.assert(false, "hehe"); //2 /*exit beforeExit uncaughtException Signal 退出状态码:1 Uncaught Fatal Exception 2 Unused*/ process.on('exit', function(code) { // 以下代码永远不会执行 setTimeout(function() { console.log("该代码不会执行"); }, 0); console.log('退出码为:', code); }); console.log("程序执行结束"); //3 /*Process属性:stdout stderr stdin argv execPath execArgv env exitCode version versions config pid title arch platform mainModule*/ process.stdout.write("hell guys "); process.argv.forEach( function(val, index, array) { console.log(index + ": " + val); }) console.log(process.execPath); console.log(process.mainModule); //4 /*abort chdir cwd exit getgid setgid getuid setuid getgroups setgroups initgroups kill memoryUsage nextTick umask uptime hrtime*/ // 输出当前目录 console.log('当前目录: ' + process.cwd()); // 输出当前版本 console.log('当前版本: ' + process.version); // 输出内存使用情况 console.log(process.memoryUsage());
util:常用工具
util.inherits(sub, base) Sub仅仅继承了Base 在原型中定义的函数,而构造函数内部创造的属 性和函数没有被继承。 util.inspect(pes, true) 将对象转换为字符串,可以查看结构 isArray isRegExp isDate isError
fs:文件系统
文件系统 var fs = require("fs"); fs.readFile('input.txt', function(err, data){}}); fs.readFileSync('input.txt')); fs.open(path, flags[, mode], callback) fs.stat(path, callback)判断是否是。。 //tats.isFile() isDirectory isSocket fs.writeFile(filename, data[, options], callback) //options包含 {encoding, mode, flag}。默认为utf8,0666,'w' fs.ftruncate(fd, len, callback) fs.unlink(path, callback) mkdir readdir rmdir rename ftruncate ftruncateSync chown access用户权限
get/post
var http = require('http'); var url = require('url'); var util = require('util'); http.createServer(function(req, res){ res.writeHead(200, {'Content-Type': 'text/plain'}); res.end(util.inspect(url.parse(req.url, true))); }).listen(3000); /*http://localhost:3000/user?name=w3c&email=w3c@w3cschool.cc Url { protocol: null, slashes: null, auth: null, host: null, port: null, hostname: null, hash: null, search: '?name=w3c&email=w3c@w3cschool.cc', query: { name: 'w3c', email: 'w3c@w3cschool.cc' }, pathname: '/user', path: '/user?name=w3c&email=w3c@w3cschool.cc', href: '/user?name=w3c&email=w3c@w3cschool.cc' }*/ http.createServer(function(req, res){ var post = ''; //定义了一个post变量,用于暂存请求体的信息 req.on('data', function(chunk){ //通过req的data事件监听函数,每当接受到请求体的数据,就累加到post变量中 post += chunk; }); req.on('end', function(){ //在end事件触发后,通过querystring.parse将post解析为真正的POST请求格式,然后向客户端返回。 post = querystring.parse(post); res.end(util.inspect(post)); }); }).listen(3000);
nodejs工具模块
var os = require("os") os.tmpdir endianness hostname type platform arch release uptime loadavg totalmem freemem cpus networkInterfaces var path = require("path") normalize join resolve isAbsolute relative dirname basename extname parse format domain模块: 简化异步代码的异常处理,可以捕捉处理try catch无法捕捉的异常 把不同的IO操作作为一个组,注册时间会掉到domain,发生错误或者抛出一个错误,domain对象会被通知,不会丢失上下文环境,也不导致错误立即推出。 domain.create add remove run(隐式绑定) dispose eixt bind intercept enter members var dns = require("dns") var dns = require("dns"); dns.lookup('www.github.com', function onLookup(err, address, family) { console.log('ip 地址:', address); dns.reverse(address, function (err, hostnames) { if (err) { console.log(err.stack); } else { console.log('反向解析' + address +":" + JSON.stringify(hostnames)); } }) }); lookup lookupService resolve resolve4 reverse解析 getServers resolveTxt resolveSoa resolveNs
4、多进程
Nodejs单线程运行,事件驱动利于多cpu多进程,提高性能。每个子进程有child.stdin,child,stdout,child.stderr。Node提供了child_process创建子进程,方法有exec(使用子进程执行命令,缓存子进程输出)、spawn(使用指定命令行参数创建新进程)、fork(spawn的特殊形式)
child_process.exec(command[, options], callback)
//support.js console.log("进程 " + process.argv[2] + " 执行。"); //master.js const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var workerProcess = child_process.exec('node support.js ' +i, errStdout); workerProcess.on('exit', function(code) { console.log('子进程已退出,退出码 ' + code); }) }; function errStdout(error, stdout, stderr) { if(error) { console.log(error.stack()); console.log('Error code: ' + error.code); console.log('Signal received: ' + error.signal); } else { console.log('stdout: ' + stdout); console.log('stderr: ' + stderr); } };
child_process.spawn(command[, args][, options])
spawn() 方法返回流 (stdout & stderr),在进程返回大量数据时使用。进程一旦开始执行时 spawn() 就开始接收响应。
//master.js const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var workerProcess = child_process.spawn('node', ['support.js', i]); workerProcess.stdout.on('data', function(data) { console.log('stdout: ' + data); }); workerProcess.stderr.on('data', function(data) { console.log('stderr:' + data); }) workerProcess.on('close', function(code) { console.log('子进程已退出,退出码 ' + code); }) };
child_process.fork(modulePath[, args][, options])
//master.js const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var workerProcess = child_process.fork('test1.js', [i]); workerProcess.on('close', function(code) { console.log('子进程已退出,退出码:' + code); }) };
3、Express框架
npm install express --save
//node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。
body-parser
//这就是一个解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。
cookie-parser
中间件,用于处理 enctype="multipart/form-data"(设置表单的MIME编码)的表单数据。
npm install multer --save
app.get('/', function (req, res) { // -- }) request 和 response 对象的具体介绍: Request 对象 - request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性。常见属性有: req.app:当callback为外部文件时,用req.app访问express的实例 req.baseUrl:获取路由当前安装的URL路径 req.body / req.cookies:获得「请求主体」/ Cookies req.fresh / req.stale:判断请求是否还「新鲜」 req.hostname / req.ip:获取主机名和IP地址 req.originalUrl:获取原始请求URL req.params:获取路由的parameters req.path:获取请求路径 req.protocol:获取协议类型 req.query:获取URL的查询参数串 req.route:获取当前匹配的路由 req.subdomains:获取子域名 req.accpets():检查请求的Accept头的请求类型 req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages req.get():获取指定的HTTP请求头 req.is():判断请求头Content-Type的MIME类型 Response 对象 - response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据。常见属性有: res.app:同req.app一样 res.append():追加指定HTTP头 res.set()在res.append()后将重置之前设置的头 res.cookie(name,value [,option]):设置Cookie opition: domain / expires / httpOnly / maxAge / path / secure / signed res.clearCookie():清除Cookie res.download():传送指定路径的文件 res.get():返回指定的HTTP头 res.json():传送JSON响应 res.jsonp():传送JSONP响应 res.location():只设置响应的Location HTTP头,不设置状态码或者close response res.redirect():设置响应的Location HTTP头,并且设置状态码302 res.send():传送HTTP响应 res.sendFile(path [,options] [,fn]):传送指定路径的文件 -会自动根据文件extension设定Content-Type res.set():设置HTTP头,传入object可以一次设置多个头 res.status():设置HTTP状态码 res.type():设置Content-Type的MIME类型
router路由指定脚本响应客户端要求
var express = require("express"); var app = express(); app.get('/', function (req, res) { console.log("主页 GET 请求"); res.send('Hello GET'); }) //can't app.post('/', function (req, res) { console.log("主页post请求"); res.send("helo post"); }) //can't app.delete('/del_user', function (req, res) { console.log('delete请求'); res.send('删除页面'); }) app.get('/list_user', function (req, res) { console.log('listusers 请求'); res.send('用户列表页面'); }) app.get('/ab*cd', function (req, res) { console.log('get请求'); res.send('正则匹配'); }) var server = app.listen(8081, function () { var host = server.address().address var port = server.address().port console.log("应用实例,访问地址为 http://%s:%s", host, port) })
Express的内置中间件express.static来设置静态文件
//http://127.0.0.1:8081/image/logo.png app.use(express.static('public'));
get方法
//index.htm <html> <body> <form action="http://127.0.0.1:8081/process_get" method="GET"> First Name: <input type="text" name="first_name"> <br> Last Name: <input type="text" name="last_name"> <input type="submit" value="Submit"> </form> </body> </html> //test1.js var express = require('express'); var app = express(); //http://127.0.0.1:8081/image/logo.png app.use(express.static('public')); app.get('/', function (req, res) { res.send('hello world'); }) app.get('/index.htm', function (req, res) { //sendFile是文档流吗 res.sendFile( __dirname + '/' + 'index.htm'); }) app.get('/process_get', function (req, res) { //输出JSON格式 response = { firse_name:req.query.first_name, last_name:req.query.last_name } console.log(response); res.end(JSON.stringify(response)); }) var server = app.listen(8081, function () { var host = server.address().address var port = server.address().port console.log("应用实例,访问地址为 http://%s:%s", host, port) })
post方法
//index.htm <html> <body> <form action="http://127.0.0.1:8081/process_post" method="POST"> First Name: <input type="text" name="first_name"> <br> Last Name: <input type="text" name="last_name"> <input type="submit" value="Submit"> </form> </body> </html> //test1.js var express = require('express'); var app = express(); var bodyParser = require('body-parser'); var urlencodedParser = bodyParser.urlencoded({ extended: false}); //http://127.0.0.1:8081/image/logo.png app.use(express.static('public')); app.get('/', function (req, res) { res.send('hello world'); }) app.get('/index.htm', function (req, res) { //sendFile是文档流吗 res.sendFile( __dirname + '/' + 'index.htm'); }) app.post('/process_post', urlencodedParser, function (req, res) { //输出JSON格式 response = { first_name:req.body.first_name, last_name:req.body.last_name } console.log(response); res.end(JSON.stringify(response)); }) var server = app.listen(8081, function () { var host = server.address().address var port = server.address().port console.log("应用实例,访问地址为 http://%s:%s", host, port) })
upload
//有问题会报错还需调试 //index.htm <html> <body> <h3>文件上传:</h3> 选择一个文件上传:<br/> <form action="/file_upload" method="POST" unctype="multipart/form-data"> <input type="file" name="image" size="50"/><br/> <input type="submit" name="上传文件"> </form> </body> </html> /// var express = require('express'); var app = express(); var fs = require("fs"); var bodyParser = require('body-parser'); var multer = require("multer"); app.use(express.static('public')); app.use(bodyParser.urlencoded({ extended: false})); app.use(multer({ dest: '/tmp/'}).array('image')); app.get('/index.htm', function (req, res) { //sendFile是文档流吗 res.sendFile( __dirname + '/' + 'index.htm'); }) app.post('/file_upload', function (req, res) { console.log(req.files[0]); //上传的文件信息 var des_file = __dirname + '/' + req.files[0].originalname; fs.readFile( req.files[0].path, function (err, data) { fs.writeFile(des_file, data, function (err) { if (err) { console.log(err); res.end(err); } else { response = { message: 'File uploaded successfully', filename: req.files[0].originalname }; console.log(response); res.end(JSON.stringify( response )); } }) }); }) var server = app.listen(8081, function () { var host = server.address().address var port = server.address().port console.log("应用实例,访问地址为 http://%s:%s", host, port) })
cookies
//可能有问题,没整明白 var express = require("express") var cookieParser = require("cookie-parser") var app = express() app.use(cookieParser) app.get('/a', function (req, res) { console.log("Cookies:", req.cookies) }) app.listen(8081)
2、REST
RESTful API(Representational State Transfer表述性状态传递),REST通常基于使用HTTP,URI,XML以及HTML这些广泛流行的协议和标准,通常使用JSON数据格式。
四个方法: get获取~数据 put添加~ delete删除~ post更新或添加~
//server.js //RESTful API @fanyu20160620 //问题没解决:1、deleteUser无法注册 2、新增可以显示,但是没有实际更新 /*序号 URI HTTP方法 发送内容 结果 1 listUsers GET 空 显示所有用户列表 2 addUser POST JSON字符串 添加新用户 3 deleteUser DELETE JSON字符串 删除用户 4 :id GET 空 显示用户详细信息*/ var express = require('express'); var app = express(); var fs = require("fs"); //添加新用户1/2 var user = { "user4": { "name" : "miaomiaoTobe", "password" : "password1", "profession" : "Web Representation", "id" : 4 } }; //添加新用户 /addUser app.get('/addUser', function(req, res) { fs.readFile( __dirname + "/" + "users.json", "utf8", function(err, data) { data = JSON.parse(data); console.log(data); data['user4'] = user["user4"]; res.end(JSON.stringify(data)); console.log(data); }); }); //显示所有用户列表 /listUsers app.get('/listUsers', function(req, res) { fs.readFile( __dirname + "/" + "users.json", "utf8", function(err, data) { console.log(data); res.end(data); }); }); //显示用户详细信息 /2 app.get('/:id', function (req, res) { fs.readFile( __dirname + '/' + 'users.json', 'utf8', function (err, data) { data = JSON.parse(data); var user = data["user" + req.params.id]; console.log(JSON.stringify(user)); res.end(JSON.stringify(user)) }); }); //删除用户/deleteUser app.get('/deleteUser', function (req, res) { fs.readFile( __dirname + '/' + 'users.json', 'utf8', function (err, data) { data = JSON.parse(data); delete data["user" + 2]; console.log(data); res.end( JSON.stringify(data) ); }); }); //监听8081端口 var server = app.listen(8081, function() { var host = server.address().address; var port = server.address().port; console.log("应用实例,访问地址为 http://%s:%s", host, port); }); //users.json { "user1": { "name" : "miaomiao1", "password" : "password1", "profession" : "teacher", "id" : 1 }, "user2": { "name" : "miaomiao2", "password" : "password2", "profession" : "librarion", "id" : 2 }, "user3": { "name" : "miaomiao3", "password" : "password3", "profession" : "clerk", "id" : 3 } }
1、JXcore 打包
nodejs是开放源代码,跨平台、用于服务器端和网络应用的运行环境。JXcore是一个支持多线程的Nodejs发行版本,基本不需要对现有代码任何改动就能线程安全的多线程运行。http://0x9.me/pcj8E