node.js是运行在服务端的JavaScript
1、创建nodejs服务器
使用http模块
引入http模块
开始创建服务器 createServer
req request指代url信息
res requestserver浏览器返回的响应信息
localhost:8000/?id=1&name=zhangsan
var http=require("http");
var url=require("url"); //路径解析模块
http.createServer(function(req,res){
//设置响应头 字符集utf-8解决中文乱码
res.writeHeader(200,{"Content-Type":"text/html;charset=utf-8"});
/* console.log(req.url);// / /favicon.ico */
if(req.url != "/favicon.ico"){
res.write("我是nodejs服务器");
console.log(req.url); // /
/*console.log(url.parse(req.url,true));//解析路径 */
let path=url.parse(req.url,true);
let data=path.query;//拿到路径上的json数据
console.log(data);// {id:'1',name:'zhangsna'}
}
res.end();//请求完成之后 结束服务器
}).listen(8000);//端口8000
console.log("http://localhost:8000");
启动js文件 node ?.js 有修改就得重新启动
nodejs自启动工具 supervisor 安装cnmp install -g supervisor
启动文件 supervisor ?.js
2、nodejs模块
①内置模块 http url fs
②自定义模块 外部的js文件封装代码
③插件
模块暴露:moudle.export=sever;
server.js
var http = require("http");
var url = require("url");
let server=http.createServer(function(req,res){
res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"});
if(req.url != "/favicon.ico"){
let path=url.parse(req.url,true);
let data=path.query;
console.log(data.id,data.name);
res.write("我的nodejs服务器");
}
}).listen(8000);
moudle.export=server;
在另一个app.js文件中引入server.js
就可以 node app.js运行文件
let server=require("./server");//写相对路径
student.js
let stus={
name:"张三",
age:"18",
}
module.export=stus;
在server.js 中引用student.js的数据var stu=require("./student");
res.write(stu.name);
collection.js
函数模块暴露
在server.js里requirevar fun=require("./collection")
然后console.log(fun());
就会输出函数的运行结果
moudle.exports=function(){
return ?;
}
在app.js中也可以运行student.js collection.js文件 因为app.js已经引入了nodejs搭建的服务器
我们可以建一个文件夹叫node_moudles 把需要连接的js文件放进去 此时require文件时就可以不写相对路径 直接写文件名
★插件 —— 第三方模块
先在项目里面生成package-json配置文件 生成命令 cnpm init
进入www.npmjs.com
md5加密模块 单向加密 只能加密不能解密
安装MD5插件 cnpm install md5-node --save
先导入加密包let md5=require("md5-node");
加密md5();
比如md5(123);
★
★通常的php+js php需要放在Apache服务器下运行 而node可以自己生成服务端
node可以做中间层(IO) 沿用js的语法
①全局对象 何时何地都可以访问 ②核心对象 来自系统 ③自定义对象 按路径引入
(1)process是全局对象console.log(process.env)
(environment)
process.env
是一个对象 我们可以通过其属性名来获取具体的环境变量值process.env.环境变量名
(2)node运行console.log(process.argv)
的文件后面可以输入 将拿到一个数组[node的绝对路径,文件的绝对路径,传递值,传递值]
传递值在cmd中
let num1=process.argv[2];
let num2=process.argv[3];
let num=num1+num2;
setTimeout(()=>{
console.log(num);
},2000);
//cmd运行 node xxx.js 传值 传值
(3)__filename
获取当前运行文件的目录 绝对路径
__dirname
运行当前文件的绝对路径
④commonjs
文件是一个模块 单独执行能力 寻求其他模块支持的能力 提供自己给其他模块的能力
也就是 引用外部模块require & 模块暴露module.export
⑤核心对象 path const path=require('path');
//路径拼接 校验 path.join()
const path=require('path');
const aPath=path.join(__dirname,'/one/','//two//');
console.log(apath);// console 当前目录/one/two
//根据相对路径 返回绝对路径 path.resolve()
const str='./abc/efg.js';
let bPath=path.resolve(str);
console.log(bpath);
//接收字符串路径将其转换为对象 path.join()
const path=require('path');
let cPath=path.join(__dirname,'abc','def','xxx.txt');
let pathObj=path.parse(myPath);
console.log(pathObj);//{root: dir: base:'xxx.txt' ext:'.txt' name:'xxx' }
path.base='xxx';//修改
//path.format() 路径对象转字符串
⑤fs 文件操作 const fs=require('fs');
读fs.readFile(url,callback);
写fs.writeFile(url,data,callback);
异步 同步会阻塞后续代码的运行 callback就是一个异步的过程
异步读取 readFile()
同步读取readFileSync()
const fs=require('fs');
fs.readFile('./xxx.xxx',(err,data)=>{
if(err) throw err;
console.log(data);//输出 buffer HEX(16进制) HEX→DEC ascii→对应字母等
console.log(data.toString());//获取里面的字符串数据
//也可以在()加 'utf8'
})
fs.writeFile('./xxx.xxx','写的内容',(err)=>{
if (err) throw err;
console.log('完成');
//将会覆盖原文件
})
//追加
fs.writeFile('./xxx.xxx','写的内容',{flag:'a'},(err)=>{});
//追加 appendFile(url,data,callback)
fs.appendFile('./xxx.xxx','追加',(err)=>{
if (err) throw err;
})
//读写
let data=fs.readFileSync('./a.txt','utf8');
fs.writeFuleSync('./b.txt',data);//将会复制一个与a内容一致的txt
判断文件:w写 r读 x存在
fs.access fs.readdir fs.stats
遍历文件夹-S
--save
-D
--save-dev
⑥nodeIO中间层
IO接收请求报文不阻塞其它代码 响应不必等待O的写出完成 与IO操作结果无关的代码不阻塞
模型 客户端+Nginx+node+服务器