Nodejs介绍
Node.js是一个Javascript运行环境(runtime)。它让JavaScript可以开发后端程序,它几乎能实现其他后端语言能实现的所有功能。
- Nodejs是基于GoogleV8引擎,V8引擎是Google发布的一款开源的JavaScript引擎,原来主要用于Chrome浏览器的JS解释部分,但是RyanDahl这哥们,鬼才般的,把这个V8引擎搬到了服务器上,用于做服务器的软件。
Nodejs官网
Npm包管理
1、Node.js创建第一个应用
-
引入http模块/创建服务器
varhttp=require('http'); http.createServer(function(request,response){ //发送HTTP头部 //HTTP状态值:200:OK //设置HTTP头部,状态码是200,文件类型是html,字符集是utf8 response.writeHead(200,{"Content-Type":"text/html;charset=UTF-8"}); //发送响应数据"HelloWorld" res.end("哈哈哈哈,我买了一个iPhone"+(1+2+3)+"s"); }).listen(8888); //终端打印如下信息 console.log('Serverrunningathttp://127.0.0.1:8888/');
-
运行程序
node xxx.js
-
浏览器访问
2、HTTP模块、URL模块
Node.js中,将很多的功能,划分为了一个个module(模块)。Node.js中的很多功能都是通过模块实现。
1. HTTP模块的使用
//引用模块
varhttp=require("http");
res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"});
//设置一个响应头:
//创建一个服务器,回调函数表示接收到请求之后做的事情
varserver=http.createServer(function(req,res){
//req参数表示请求,res表示响应
console.log("服务器接收到了请求"+req.url);
res.end();//End方法使Web服务器停止处理脚本并返回当前结果
});
//监听端口
server.listen(3000,"127.0.0.1");
2. URL模块的使用
>url.parse()解析URL
url.format(urlObject)//是上面url.parse()操作的逆向操作
url.resolve(from,to)添加或者替换地址
3. Nodejs自启动工具supervisor
- 首先安装:
npminstall-gsupervisor
- 使用supervisor代替node命令启动应用:
supervisor xxxx.js
4. CommonJs
CommonJS是模块化的标准,nodejs是CommonJS(模块化)的实现。
- 我们可以把公共的功能抽离成为一个单独的js文件作为一个模块,默认情况下面这个模块里面的方法或者属性,外面是没法访问的。如果要让外部可以访问模块里面的方法或者属性,就必须在模块里面通过exports或者module.exports暴露属性或者方法。
- 在需要使用这些模块的文件中,通过require的方式引入这个模块。这个时候就可以使用模块里面暴露的属性和方法。
- 自定义 模块
//定义一个tools.js的模块
//模块定义
vartools={
sayHello:function(){
return
'
helloNodeJS';
},
add:function(x,y){
returnx+y;
}
};
//模块接口的暴露
//module.exports=tools;
exports.sayHello=tools.sayHello;
exports.add=tools.add;
varhttp=require('http');
//引入自定义的tools.js模块
vartools=require('./tools');
tools.sayHello();//使用模块
5. 安装淘宝镜像
npm install-gcnpm--registry=https://registry.npm.taobao.org
6. Nodejs中的fs模块的使用
-
fs.stat检测是文件还是目录
constfs=require('fs') fs.stat('hello.js',(error,stats)=>{ if(error){ console.log(error) }else{ console.log(stats) console.log(`文件:${stats.isFile()}`) console.log(`目录:${stats.isDirectory()}`) } })
-
fs.mkdir创建目录
constfs=require('fs') fs.mkdir('logs',(error)=>{ if(error){ console.log(error) }else{ console.log('成功创建目录:logs') } })
-
fs.writeFile创建写入文件
fs.writeFile('logs/hello.log','您好~\n',(error)=>{ if(error){ console.log(error) }else{ console.log('成功写入文件') } })
-
fs.appendFile追加文件
fs.appendFile('logs/hello.log','hello~\n',(error)=>{ if(error){ console.log(error) }else{ console.log('成功写入文件') } })
-
fs.readFile读取文件
constfs = require("fs"); fs.readFile("logs/hello.log", "utf8", (error, data) => { if (error) { console.log(error); } else { console.log(data); } });
-
fs.readdir读取目录
constfs=require('fs') fs.readdir('logs',(error,files)=>{ if(error){ console.log(error) }else{ console.log(files) } })
-
fs.rename重命名
constfs=require('fs') fs.rename('js/hello.log','js/greeting.log',(error)=>{ if(error){ console.log(error) }else{ console.log('重命名成功') } })
-
fs.rmdir删除目录
fs.rmdir('logs',(error)=>{ if(error){ console.log(error) }else{ console.log('成功的删除了目录:logs') } })
-
fs.unlink删除文件
fs.unlink(`logs/${file}`,(error)=>{ if(error){ console.log(error) }else{ console.log(`成功的删除了文件:${file}`) } })
-
fs.createReadStream从文件流中读取数
constfs=require('fs') varfileReadStream=fs.createReadStream('data.json') letcount=0; varstr= '' ; fileReadStream.on('data',(chunk)=>{ console.log(`${++count}接收到:${chunk.length}`); str+=chunk }) fileReadStream.on('end',()=>{ console.log('---结束---'); console.log(count); console.log(str); }) fileReadStream.on('error',(error)=>{ console.log(error) })
-
fs.createWriteStream写入文件
varfs=require("fs"); vardata='我是从数据库获取的数据,我要保存起来'; //创建一个可以写入的流,写入到文件output.txt中 varwriterStream=fs.createWriteStream('output.txt'); //使用utf8编码写入数据 writerStream.write(data,'UTF8'); //标记文件末尾 writerStream.end(); //处理流事件-->finish事件 writerStream.on('finish',function(){/*finish-所有数据已被写入到底层系统时触发。*/ console.log("写入完成。"); }); writerStream.on('error',function(err){ console.log(err.stack); }); console.log("程序执行完毕");
7. 管道流
管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。
varfs=require("fs");
//创建一个可读流
varreaderStream=fs.createReadStream('input.txt');
//创建一个可写流
varwriterStream=fs.createWriteStream('output.txt');
//管道读写操作
//读取input.txt文件内容,并将内容写入到output.txt文件中
readerStream.pipe(writerStream);
console.log("程序执行完毕");
3、路由
路由
(Routing)是由一个URI(或者叫路径)和一个特定的HTTP方法(GET、POST等)组成的,涉及到应用如何响应客户端对某个网站节点的访问。
const http = require('http');
const path = require('path');
const url = require('url');
const routes = require('./module/routes');
http.createServer(function (req, res) {
//创建静态web服务
routes.static(req,res,'static');
//路由
let pathname=url.parse(req.url).pathname;
let extname = path.extname(pathname);
if(!extname){ //如果有请求地址有后缀名的话让静态web服务去处理
if(pathname=='/login'){
res.end("执行登录");
}else if(pathname=='/register'){
res.end("执行注册");
}else if(pathname=='/admin'){
res.end("处理后的业务逻辑");
}else{
res.end("404");
}
}
}).listen(3000);
4、初识EJS模块引擎
我们学的EJS是后台模板,可以把我们数据库和文件读取的数据显示到Html页面上面。它是一个第三方模块,需要通过npm安装:npminstallejs–save
EJS常用标签
<%%>
流程控制标签<%=%>
输出标签(原文输出HTML标签)<%-%>
输出标签(HTML会被浏览器解析)
5、Get、Post
GET-从指定的资源请求数据。(一般用于获取数据)
POST-向指定的资源提交要被处理的数据。(一般用于提交数据)
加粗样式获取GET传值:
varurlinfo=url.parse(req.url,true);
urlinfo.query;
获取POST传值:
varpostData = "";
//数据块接收中
req.on("data", function (postDataChunk) {
postData += postDataChunk;
});
//数据接收完毕,执行回调函数
req.on("end", function () {
try {
postData = JSON.parse(postData);
} catch (e) {}
req.query = postData;
console.log(querystring.parse(postData));
});