一、Node.js
1. Hello World
var http = require('http');
http.createServer(function(request, response) {
response.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});
if(request.url!=="/favicon.ico"){ //清除第2此访问
console.log('访问');
response.write('hello,world');
response.end('hell,世界');//不写则没有http协议尾,但写了会产生两次访问
}
}).listen(8000);
console.log('Server running at http://127.0.0.1:8000/');
/*
启动服务
cmd下执行:
node n1_hello.js
浏览器访问:http://localhost:8000
*/
2. 函数调用
//---服务器node.js---
var http = require('http');
var otherfun = require('./models/otherfuns.js');
http.createServer(function(request,response){
response.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});
if(request.url!=="/favicon.ico"){ //清除第2此访问
fun1(response);
otherfun.controller(request,response);
otherfun.call(response);
//---使用字符串调用对应的函数---
funcname = "addContent"
otherfun[funcname](response);
otherfun['getVisit'](response);
response.end('');
}
}).listen(8000);
console.log('Server running at http://127.0.0.1:8000/');
//---普通函数---
function fun1(res){
res.write("你好,我是fun1");
}
//---/models/otherfuns.js---
function controller(req,res){
res.write("发送");
call('hello',req,res);
res.end("");
}
function call(res){
console.log('call');
}
module.exports = controller; //只支持一个函数
//只支持多个函数
module.exports={
getVisit:function(){
return visitnum++;
},
addContent:function(a,b){
return a+b;
}
}
3. 模块调用
//---node.js---
var http = require('http');
//var User = require('./models/User');
var Teacher = require('./models/Teacher');
http.createServer(function(request,response){
response.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});
if(request.url!=="/favicon.ico"){ //清除第2此访问
//实例化teacher对象
teacher = new Teacher(1,'李四',30);
teacher.teach(response);
response.end('');
}
}).listen(8000);
//---User.js--
function User(id,name,age){
this.id=id;
this.name=name;
this.age=age;
this.enter=function(){
console.log("进入图书馆");
}
}
module.exports = User;
//---models/Teacher.js---
var User = require('./User');
function Teacher(id,name,age){
//没有构造方法,继承父类
User.apply(this,[id,name,age]);
this.teach=function(res){
res.write(this.name+"老师讲课");
}
}
module.exports = Teacher;
4. 路由
//---node.js---
var http = require('http');
var url = require('url');
var router = require('./router');
http.createServer(function(request,response){
response.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});
if(request.url!=="/favicon.ico"){
//获取url的路径
var pathname = url.parse(request.url).pathname;
//替换掉路径前面的 /
pathname = pathname.replace(///,'');
router[pathname](request,response);
response.end('');
}
}).listen(8000);
//---router.js---
module.exports={
login:function(req,res){
res.write("我是login方法");
},
zhuce:function(req,res){
res.write("我是注册方法");
}
}
5. 文件读取
//---node.js---
var http = require("http");
var optfile = require("./models/optfile");
http.createServer(function(request,response){
response.writeHead(200,{'Content-Type':'text/html';charset=utf-8'});
if(request.url!=="/favicon.ico"){
//闭包函数;防止异步操作时,已经end了,再进行write报错
function recall(data){
response.write(data);
response.end('ok')
}
optfile.readfile('./views/login.html',recall);
console.log('主程序执行完毕');
}
}).listen(8000)
//---/models/optfile---
var fs = require('fs');
module.exports={
//同步读取
readfileSync:function(path){
var data = fs.readFileSync(path,'utf-8');
console.log("同步方法执行完毕");
return data;
},
//异步读取
readfile:function(path,recall){
fs.readFile(path,function(err,data){
if(err){
console.log(err);
}else{
console.log(data.toString());
recall(data);
}
})
}
}
//---修改后路由---
//---node.js---
var http = require('http');
var url = require('url');
var router = require('./router');
var optfile = require("./models/optfile");
http.createServer(function(request,response){
response.writeHead(200,{'Content-Type':'text/html';charset=utf-8'});
if(request.url!=="/favicon.ico"){
//获取url的路径
var pathname = url.parse(request.url).pathname;
//替换掉路径前面的 /
pathname = pathname.replace(///,'');
router[pathname](request,response);
console.log('主程序执行完毕');
}
}).listen(8000)
//---router.js---
var optfile = require("./models/optfile");
module.exports={
login:function(req,res){
function recall(data){
res.write(data);
res.end("");
}
optfile.readfile('./views/login.html',recall);
},
zhuce:function(req,res){
function recall(data){
res.write(data);
res.end("");
}
optfile.readfile('./views/zhuce.html',recall);
}
}
6. 文件写入
//---node.js---
var http = require('http');
var url = require('url');
var router = require('./router');
var optfile = require("./models/optfile");
http.createServer(function(request,response){
response.writeHead(200,{'Content-Type':'text/html';charset=utf-8'});
if(request.url!=="/favicon.ico"){
//获取url的路径
var pathname = url.parse(request.url).pathname;
//替换掉路径前面的 /
pathname = pathname.replace(///,'');
router[pathname](request,response);
console.log('主程序执行完毕');
}
}).listen(8000)
//---/models/optfile---
var fs = require('fs');
module.exports={
//同步写入
writefileSync:function(path,data){
fs.writeFileSync(path,data);
console.log("同步方法执行完毕");
},
//异步读取
writefile:function(path,data,recall){
fs.writeFile(path,data,function(err){
if(err){
throw err;
}else{
console.log("It is saved!");
recall('写文件成功')
}
})
}
}
//---router.js---
var optfile = require("./models/optfile");
module.exports={
login:function(req,res){
function recall(data){
res.write(data);
res.end("");
}
optfile.readfile('./views/login.html');
},
writefile:function(req,res){
function recall(data){
res.write(data);
res.end("");
}
optfile.writefile('./views/one.txt','hello world',recall);
}
}
7. 读取图片
//---node.js---
var http = requrie('http');
var optfile = require('./models/optfile');
http.createServer(function(request,response){
//读取图片需要时二进制流格式
response.writeHead(200,{'Content-Type':'image/jpeg'});
if(request.url!='/favicon.ico'){
optfile.readImg('./imgs/pig.png',response);
}
}).listen(8000);
//---/models/optfile---
var fs = require('fs');
module.exports={
readImg:function(path,res){
//默认为string,binary是二进制
fs.readFile(path,'binary',function(err,filedata){
if(err){
console.log(err);
return;
}else{
res.write(filedata,'binary');
res.end();
}
})
}
}
8. 异常处理
//同步捕获异常
pathname = url.parse(request.url).pathname;
pathname = pathname.replace(///,'');
try{
router[pathname](request,response);
}catch(err){
console.log("error="+err);
response.writeHead(200,{'Content-Type':'text/html';charset='utf-8'});
response.write(err.toString());
response.end('');
}
//---node.js---
var http = require('http');
var url = require('url');
var router = require('./router');
var exception = require('./models/Exception');
http.createServer(function (request,response){
if(request.url!=="/favicon.ico"){//清除第2此访问
pathname=url.parse(request.url).pathname;
pathname = pathname.replace(///,'');//替换掉前面的/
try{
//router[pathname](request,response);
data = exception.expfun(0);
response.write(data);
response.end('');
}catch(err){
console.log('aaaaa='+err);
response.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});
response.write(err.toString());
response.end('');
}
console.log("server执行完毕");
}
}).listen(8000);
//---Exception.js---
module.exports={
expfun:function(flag){
if(flag==0){
//抛出异常
throw '我是例外';
}
return "success";
}
}
9. 参数接收
<form action='./login' method='get'>
<input type='text' name='email'/>
<input type='password' name='pwd'/>
<input type='submit' value='登录'>
</form>
//---node.js---
var http = require('http');
var url = require('url');
var router = require('./router');
http.createServer(function(request,response){
if(request.url!=="/favicon.ico"){ //清除第2此访问
pathname=url.parse(request.url).pathname;
pathname = pathname.replace(///,'');//替换掉前面的/
try{
router[pathname](request,response);
}catch(err){
console.log('出错='+err);
response.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});
response.write(err);
response.end('');
}
console.log("server执行完毕");
}
}).listen(8000);
//---router.js--
var optfile = require('./models/optfile');
var url = require('url');
var querystring = require('querystring'); //post需导入
module.exports={
login:function(req,res){
//--------get方式接收参数----------------
var rdata = url.parse(req.url,true).query;
console.log(rdata);
if(rdata['email']!=undefined){
console.log(rdata['email']);
}
//-------post方式接收参数----------------
var post = '';//定义了一个post变量,用于暂存请求体的信息
//通过req的data事件监听函数,每当接受到请求体的数据,就累加到post变量中
req.on('data', function(chunk){
post += chunk;
});
//-------注意异步-------------
//在end事件触发后,通过querystring.parse将post解析为真正的POST请求格式,然后向客户端返回。
req.on('end', function(){
post = querystring.parse(post);
console.log('email:'+post['email']+'
');
console.log('pwd:'+post['pwd']+'
');
});
//---------------------------------------
data = optfile.readfileSync('./views/login.html');
res.write(data);
res.end();
}
}