nodejs

1.nodeJS 入门
方法一:
a.js内容
    console.log('hello');
cmd 进入到相应目录
    node a.js 就可以看到结果    
方法二:
    直接cmd 输入 node 回车,再 console.log('hello');回车, 也可以看到结果   退出输入 .exit或者 ctrl+d 
    
2.写一个server.js当服务器, 最终 浏览器访问127.0.0.1:8888 可看到服务器端返回的内容
server.js内容

var http=require('http');

http.createServer(function(request,response){
    response.writeHead(200,{'Content-Type':'text/plain'});
    response.end('hello a');
}).listen(8888);

console.log('server running');

3.安装 express [没具体应用]
  npm install express 
  
4. node 可以定义变量,进行计算
   cmd:  node  x=10 y=20 x+y  每一个都要回车,结果为30
5.读取文件内容【回调函数】
不需要等文件读取完,先执行下面的程序,等文件读取完,作为回调函数的参数返回输出。在读取文件时同时执行接下来的代码,大大提高了程序的性能。  先输出 game over 再输入文件内容
main.js

var fs=require('fs');

var data=fs.readFile('a.js',function(err,data){
    if(err)return console.error(err);
    console.log(data.toString());
});
console.log('game over');
     
node main.js 

二 代码来源于手册

// console.log("this is a");


//  emiter 

/*
var events= require('events');
var eventEmitter = new events.EventEmitter();
eventEmitter.on('a',function(){    //注册函数a 
    console.log('a event asf');
}); 

    eventEmitter.emit('a');      // 触发函数a 
*/

// stream读取文件 
/*
var fs=require("fs");
var data='';
var readStream= fs.createReadStream('main.js');

readStream.setEncoding('utf8');

readStream.on('data',function(chunk){   //读数据
    data+=chunk;
});

readStream.on('end',function(){      // 输出数据
    console.log(data);
});

readStream.on('error',function(err){
    console.log(err.stack);
    
});
*/
//  stream 写文件          
//  cmd下 type a.txt 是查看文件内容
/*
var fs=require("fs");
var data='this is the new data';
var writeStream=fs.createWriteStream('a.txt');
writeStream.write(data,'utf8');
writeStream.end();    //标记文件末尾
writeStream.on('finish',function(){
    console.log("ok");
});

writeStream.on('error',function(){
    console.log(err.stack);
});
*/
//  把文件a 内容复制到 文件b 
/*
var fs=require("fs");
var readStream=fs.createReadStream('main.js');
var writeStream=fs.createWriteStream("a.txt");
readStream.pipe(writeStream);
console.log("game over");
*/
//  压缩文件 a.txt 为  a.txt.gz
/*
var fs=require("fs");
var zlib=require("zlib");
fs.createReadStream('a.txt')
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream('a.gz'));

console.log('ok2');
*/
//   解压 a.txt.gz   跟传统解压的效果不太一样
/*
var fs=require("fs");
var zlib=require("zlib");
fs.createReadStream('a.gz')
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream('c.txt'));
console.log("ok...");
*/

// 引进 hello.js 调用world()方法
/*   // 方法一
var hello = require("./hello");
hello.world();
*/

//  方法二 
/*
var Hello = require('./hello');
hello = new Hello();
hello.setName('aaa');
hello.sayHello();
*/


// hello.js

/*
//   方法一
exports.world=function(){
    console.log('hello');
}
*/

/* 
//  方法二
function Hello(){
    var name;
    this.setName=function(setName){
        name=setName;
    };
    this.sayHello=function(){
        console.log("hello "+name);
    };
};
module.exports = Hello;  // 提供外部访问

*/

 js 面向对象写法推荐

 

<script>
// js面向对象:组合构造函数+原型模式【推荐】
function Person(name,age,job){
    this.name=name;
    this.age=age;
    this.job=job;
    this.lessons=['Math','chinese'];
}
Person.prototype = {           // 原型模式提供 对象实例共享
    constructor : Person,
    getName: function(){
        return 'hello, '+this.name;
    }
}

var person1 = new Person('xiao',19,'software');
person1.lessons.push('biology');
var person2= new Person('he',11,'english');
alert(person1.lessons);
alert(person2.lessons);
alert(person1.getName === person2.getName);   // 共享方法
alert(person1.getName());

</script>

 三、

// stat 获取文件信息
/*
var fs=require('fs');
fs.stat('nodejs.txt',function(err,stats){
    
    if(err){
        return console.error(err);
    }
    console.log(stats);
    console.log(stats.isFile());
});
*/
// writeFile 写文件  readFile 读文件 
/*
var fs=require('fs');
fs.writeFile('b.txt','this is b',function(err){
    if(err){
        return console.error(err);
    }
});
console.log('write is ok');
fs.readFile('b.txt',function(err,data){
    if(err){
        return console.err(err);
    }
    console.log("the content is: "+data.toString());
});
*/
//删除文件 
/*
var fs=require('fs');
fs.unlink('b.txt',function(err){
    if(err)return console.log(err);
});
console.log('ok');
*/
// 创建目录
/*
var fs=require('fs');
fs.mkdir("D:/test0518/test",function(err){
    if(err)return console.log(err);
    
});

console.log('ok');
*/
// 读取 目录
/*
var fs=require('fs');
fs.readdir("D:/test0518",function(err,files){
    if(err)return console.log(err);
    files.forEach(function(file){
        console.log(file);
    });
});

console.log('ok');
*/
//删除目录
/*
var fs=require('fs');
fs.rmdir("D:/test0518/test",function(err,files){
    if(err)return console.log(err);
    
});

console.log('ok');
*/
//  获取 请求内容 get     http://127.0.0.1:8888?name=a&age=12
/*
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(8888);
*/
//  获取 请求内容 post   不太懂
/*
var http=require('http');
var util=require('util');
var querystring=require('querystring');
http.createServer(function(req,res){
    var post='';
    req.on('data',function(chunk){
        post+=chunk;
    });
    req.on('end',function(){
        post=querystring.parse(post);
        res.end(util.inspect(post));
    });
}).listen(8888);

*/
// 复杂版
/*
var http = require('http');
var fs = require('fs');
var url = require('url');


// 创建服务器
http.createServer( function (request, response) {  
   // 解析请求,包括文件名
   var pathname = url.parse(request.url).pathname;
   
   // 输出请求的文件名
   console.log("Request for " + pathname + " received.");
   
   // 从文件系统中读取请求的文件内容
   fs.readFile(pathname.substr(1), function (err, data) {
      if (err) {
         console.log(err);
         response.writeHead(404, {'Content-Type': 'text/html'});
      }else{             
         response.writeHead(200, {'Content-Type': 'text/html'});          

         response.write(data.toString());        
      }
      //  发送响应数据
      response.end();
   });   
}).listen(8081);

console.log('Server running at http://127.0.0.1:8081/');
*/


// 简单版   服务端 
/*var http=require('http');
var fs = require('fs');
var url = require('url');

http.createServer(function(request,response){
    var pathname = url.parse(request.url).pathname;     //获取url文件名
    fs.readFile(pathname.substr(1),function(err,data){           //读文件 
    //if(err)return console.log(err);
        response.writeHead(200,{'Content-Type':'text/plain'});
        response.end(data.toString());
    });
}).listen(8888);
console.log("ready..");

//  http://127.0.0.1:8888/a.html
*/

/*
express 
安装四个模块 
$ npm install express --save
$ npm install body-parser --save
$ npm install cookie-parser --save
$ npm install multer --save

*/

cmd 操作

cls 清屏
type a.txt 查看文件内容

最简express 

var express = require('express');
var app=express();
app.get('/',function(req,res){              // 127.0.0.1:8081
    res.send('express page');               // 输出内容
});
app.listen(8081);
console.log('server is staring');

 访问不同页面,静态资源等

var express = require('express');
var app = express();

app.use(express.static('public'));
//访问静态资源 :        http://127.0.0.1:8081/image/123.png

//  主页输出 "Hello World"
app.get('/', function (req, res) {
    console.log('index get13');
    res.send('Hello GET');
})

//  POST 请求
app.post('/', function (req, res) {
    console.log("主页 POST 请求");
    res.send('Hello POST');
})

//  /del_user 页面响应           http://127.0.0.1:8081/del_user
app.get('/del_user', function (req, res) {
    console.log("/del_user 响应 DELETE 请求");
    res.send('删除页面');
})

// 对页面 abcd, abxcd, ab123cd, 等响应 GET 请求
app.get('/ab*cd', function(req, res) {
    console.log("/ab*cd GET 请求");
    res.send('正则匹配');
})


var server = app.listen(8081, function () {

    var host = server.address().address
    var port = server.address().port

    console.log("here http://%s:%s", host, port)

})

 表单get post    node a.js

post 要加  urlencodedParser

get  获取表单值 使用query;   post 使用 body 

a.js

/**
 * Created by Administrator on 2016/5/27 0027.
 */
var express = require('express');
var app = express();
var bodyParser = require('body-parser');         // post 专用
var urlencodedParser = bodyParser.urlencoded({extended:false})  // post 专用
app.use(express.static('public'));   // 静态资源 

app.get('/', function (req, res) {
    console.log('the root is '+__dirname);
    res.sendFile( __dirname + "/" + "index.html" );   // 指向具体页面
})

app.post('/process_get',urlencodedParser, function (req, res) {
   //  post 要加参数  urlencodedParser  req.body.first_name  中间是body
                                  // get  req.query.first_name 中间是 query
    // 输出 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)

})

对应的index.html   post 提交    127.0.0.1:8081

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<form action="http://127.0.0.1:8081/process_get" 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>

 表单文件上传

/**
 * Created by Administrator on 2016/5/27 0027.
 */
var express = require('express');
var app = express();
var fs=require('fs');

var bodyParser = require('body-parser');         // post 专用
var urlencodedParser = bodyParser.urlencoded({extended:false})  // post 专用
var multer = require('multer');

app.use(multer({dest:'/public/'}).array('image'));

app.get('/', function (req,res) {
    res.sendFile(__dirname+"/"+"index.html");
})
app.post('/process_get',urlencodedParser, function (req, res) {
    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);
            }else{
                response={
                    message:'file is ok ',
                    filenmae:req.files[0].originalname
                }
            }
        console.log(response);
        res.end(JSON.stringify(response));
        })
    })
})

var server = app.listen(8081);
console.log('ok');

 index.html

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<form action="http://127.0.0.1:8081/process_get" method="post" enctype="multipart/form-data">

    <input type="file" name="image"/>
    <input type="submit" value="Submit">
</form>
</body>
</html>

json 增删查

var express = require('express');
var fs = require('fs');
var app= express();

var user={
    "user5":{
        "name":"a5",
        "passowrd":"b5",
        "profession":"stu5",
        "id":5
    }
}
app.get('/', function (req, res) {
    fs.readFile(__dirname+"/"+"users.json","utf8", function (err,data) {
        data=JSON.parse(data); // 转成 json
    /*    data.user5 = user.user5;   //添加数据
        //  方式二    data["user5"]=user["user5"];
        res.end(JSON.stringify((data)));  //  转回  string
    */
        /*
        var user=data["user"+req.params.id];     // 取具体数据,  app.get('/:id') 要加" :id "
        res.end(JSON.stringify(user));           //  127.0.0.1:8081/2
         */
        //  删除操作
    var id=2;
        delete data["user"+id];
        res.end(JSON.stringify(data));
    })
})
app.listen(8081);

 users.json

{
  "user1": {
    "name": "mahesh",
    "password": "password1",
    "profession": "teacher",
    "id": 1
  },
  "user2": {
    "name": "suresh",
    "password": "password2",
    "profession": "librarian",
    "id": 2
  },
  "user3": {
    "name": "ramesh",
    "password": "password3",
    "profession": "clerk",
    "id": 3
  }
}

 node.js 入门经典 第5章 P56

node.js入门经典

1.模块默认本地安装
express 可能需要全局安装  npm install express -g 

2.利用package.json来安装所需要模块
a.js
var _ = require('underscore');
_.each([1,2,3],function(num){
    console.log("xx: "+num);
})
再创建一个名为 package.json文件 
{
    "name":"test",
    "verson":"0.1",
    "dependencies":{
        "underscore":"~1.2.1"
    }
}
把项目中所需要的模块 都写在 dependencies中
最后, npm install 就会自动安装所需要模块

3.nodejs 处理 并发(同时发生)
4.回调
$('p').hide('slow',function(){alert(1);});
hide()函数有两个参数,一个是slow,另一个是 function(){alert(1)}; 
hide()函数执行完后,第二个参数(函数)会被调用

5.阻塞
程序先后执行,后面的程序无法先执行,就是阻塞

6.异步(非阻塞),都是基于回调来实现,把请求的响应结果都放到回调函数来实现。于是,可以发出N个请求,然后,哪个请求响应完了,就先后返回

 node.js 入门经典 第6章 P68

回调的实现是基于事件循环。
事件循环: nodejs使用javascript的事件循环来支持异步编程。javascript围绕事件循环设计。
事件循环规则:函数必须快速返回,函数不得阻塞。长时间运行的操作必须移到另一个进程中。
异步代码解决网络问题。


// 获得 主机 端口 路径名
 var url=require('url');
 var requestURL='http://baidu.com:1234/pathname?query=a';
 var hostname=url.parse(requestURL).hostname;      //  baidu.com 
 var port=url.parse(requestURL).port;               // 1234 
 var pathname=url.parse(requestURL).pathname;       //  /pathname 
 console.log(hostname+'..'+port+'..'+pathname); 

//  底层http 路由
var http=require('http');
var url=require('url');
http.createServer(function(request,response){
 
 var hostname=url.parse(request.url).hostname;        
 var port=url.parse(request.url).port;                 
 var pathname=url.parse(request.url).pathname;       //  /pathname 
 console.log(hostname+'..'+port+'..'+pathname);   //  hostname、port为空,不懂。。
 
     if(pathname=='/a'){
        response.writeHead(200,{'Content-Type':'text/plain'});
        response.end('ao');
     }else{
        response.writeHead(200,{'Content-Type':'text/plain'});
        response.end('null o');
     }

 }).listen(8888);

 
npm install <name> --save    // 初次安装没有 package.json 文件  --save 无效。
安装的同时,将信息写入package.json中项目路径中如果有package.json文件时,直接使用npm install方法就可以根据dependencies配置安装所有的依赖包,这样代码提交到github时,就不用提交node_modules这个文件夹了。

console.log(__dirname);   // 当前文件所在路径

// 最简express 
var express=require('express');
var app=express();
app.get('/', function (req,res) {
    res.send('hello');
});

app.listen(8888);
console.log('ready')

//最简 http 
var http=require('http');

http.createServer(function(request,response){
    response.writeHead(200,{'Content-Type':'text/plain'});
    response.writeHead(301,{'Location':'http://www.baidu.com'})   //301重定向
    response.end('hello a');
}).listen(8888);

console.log('server running');

npm install express -g   把express 安装到  C:\Users\Administrator\AppData\Roaming\npm去了

 express web模块 P74

express安装  
npm install express -g  // 默认安装最新版 4.0+  
npm install express-generator   //  安装 express 4.0+要再安装这个
开始创建项目
express helloworld   //创建目录
cd helloworld && npm install  //安装所需要依赖包
npm start //   运行app
http://localhost:3000 就可以访问内容了

 nodejs module.export()

a1.js  b1.js   a1.js部分共享

// 提供被调用  a1.js
exports.test1= function () {
    console.log("this is test1: ");
}
var test2= function () {
    console.log("this is own resourse: ");
}
View Code
//  b1.js
var a=require('./a.js');
console.log(a.test1());
console.log("new Date(): "+new Date());
View Code

a2.js b2.js   a2.js全部共享

function a(){
    this.test1= function () {
        var a = 'this is a';
        console.log("a: "+a);
    }
    this.test2= function () {
        var b='this is b';
        console.log("b: "+b);
    }
}
module.exports=a;  // 把 整个a 共享出去   // 注意 exports 写法
View Code
//  b2.js
var a=require('./a.js');
a = new a();      //构造函数要  new()
console.log(a.test1());
console.log("new Date(): "+new Date());
View Code

a3.js b3.js   a3.js 全部共享2

var people={};
people.test1= function () {
    var a='this is test1111111';
    console.log("a: "+a);
}
people.test2= function () {
    var b='this is test222222222';
    console.log("b: "+b);
}
people.name='xiaoming';
 //var people="abc";
module.exports=people;
View Code
//  b3.js
var a=require('./a.js');
console.log(a.test1());
console.log("a.name: "+a.name);
//console.log("a: "+a);
console.log("new Date(): "+new Date());
View Code

 

posted @ 2016-05-25 16:08  gyz418  阅读(245)  评论(0)    收藏  举报