在不指定服务器端口的情况下,每一种协议会有一个默认找的地址
HTTP默认会找服务器的80端口HTTPS默认会找服务器的443端口FTP默认会找服务器的21端口URL:统一资源定位符 http://v.qq.com:80/index,html?name=zhufeng#bbs
-> http:传输协议 ->客户端给服务端的内容和服务器传递给客户端的内容都是通过http传输协议进行传输 -> v.qq.com :域名(请求本机域名时在window窗口下输入ipconfig,找网站的域名,输入ping xxx.com) -> 80 :端口号 -> index.html : 请求资源文件名 ->告诉服务器我需要请求的资源文件是谁 ->?name=zhufeng :URL问号传参 ->客户端传递给服务端的内容 ->#bbs :URL的hash(锚点定位)
在命令窗口中执行:在当前要执行的js文件目录下,shift+右键 => 在此处打开命令窗口 => node xxx.js => ctrl+c 重新操作
这种错误是80端口被占用
在命令窗口中打开node文件(cd …) ,然后开始编写对应代码,输入node xxx.js,执行js代码,代码中console.log输出在命令窗口中出现
1.什么是模块?
node.js中所有的功能都是以模块形式的,一个文件就是一个模块 模块与模块之间相互独立,使用模块需要引入
2.主模块
主模块是整个项目的模块,主模块对整个项目的其他模块进行统筹调度。 一个项目只允许有一个主模块 3.模块组成 所有用户编写的代码都放在模块中,模块就是文件(函数),用户编写的代码都自动封装在一个函数中
/* 模块的组成,封装在一个函数中,函数中有5个参数,如下图 exports:暴露对象,jiangmokuaideshuju暴露给引入的地方 require:引入模块的函数 module:模块对象,包括当前模块的所有信息 _filename:当前模块的文件名 _dirname:当前模块所在的路径(目录路径) */ console.log(arguments.callee.toString());npm:(NodeJS Package Manager):包管理器 1.统一下载途径 2.自动下载依赖
npm install xxx | 安装xxx npm uninstall xxx | 卸载xxx
node_modules
存放模块:可以存自己的,也可以存放下载的模块 自定义模块统一都放到node_modules里面,引入时不用加**.js**
npm
npm init :初始化 npm install xxx / npm i xxx :安装包 npm uninstall :卸载 npm publish :上传包 npm --force unpublish :删除已经上传的包(在库中) npm i xxx --save :将安装包写入package.json依赖列表 npm search xxx :搜索包 npm view xxx :查看包
package.json
package.json是node.js项目的描述文件
如何创建package.json? npm init //然后写上要求的内容 npm init -y //自动以全部yes形式生成package.json控制台命令
console.log();普通输出 console.dir(); console.assert(表达式,输出文字); 断言,当表达式为假时,输出文字 console.error();警告输出 console.time(标识); 计时开始 console.log.timeEnd(标识); 计时结束
4.模块分类
内置模块 :HTTP(creatServer…)、fs(writeFileSync、readFileSync…)、url … 自定义模块:自己定义的模块 第三方模块:别人写好的模块,我们拿来使用 ->在node中如果需要使用别人的模块,需要使用npm(NodeJS Package Manager)这个命令进行管理
引入自定义模块时,必须加**./,在当前目录下引入,不加./**时,从系统模块,或者从node_modules中找。
require:引入模块
不存在全局变量,想要输出一个东西加exports,eg:exports.a =12; exports.方法名=函数,不能改指向,是对module.export的引用。
module:用来批量输出,真正的暴露对象eg:moudle.exports={a:12,b:23,c:21};
modele.exports = 对象或函数; module.exports.方法= 函数 module.id :模块id moudle.parenr :模块父级 module.filename :模块的文件名和路径 module.paths : 模块查找路径promise
ES6中新增的承诺对象 状态: Pending :等待中 Resolved :成功 Rejected :失败
path
1.path.join(); //拼接地址 2.path.dirname(); //返回路径中的文件夹部分 3.path.parse(); //解析
var path = require('path'); var p2 = './node/static/js.html'; console.log(path.join('code',p2));//p2\node\static\js.html console.log(path.dirname(p2));//.\node\static console.log(path.parse(p2));path.parse
var http = require(“http”), fs = require(“fs”), url = require(“url”);
fs.readFile(文件名,回调函数) //读取文件信息 const fs = require("fs"); //readFile(文件名,回调函数) fs.readFile('1.txt',function(error,data){ if(error){ console.log('读取失败'); }else{ console.log(data.toString()); } });2.fs.writeFile(文件名,内容,回调函数)
const fs = require('fs'); //writeFile(文件名,内容,回调函数) fs.writeFile('write.txt',"this is content",function(error){ console.log(error); })3.fs.stat(文件名,回调函数) //读取文件信息
const fs = require('fs'); fs.stat('./sjq.txt',function(err,state){ console.log(state); });4.fs.unlink(文件路径,回调函数)
const fs = require('fs'); fs.unlink('./sjq1.txt',function(err){ if(err){ throw err;//抛出错误 }else{ console.log('删除成功!'); } });5.require注意事项
当引入的模块有语法错误时,会报错 当引入的模块路径有误时,会报错 当一个模块被多次引入时,只执行一次
//fs.readFileSync([path+name].[encode]):同步读取文件指定中的内容 (同步读取:文件中的内容读取不完不执行下面的操作,只有都读取出来才会执行后续的操作 ) if(pathname ==="/xxx.html"){ var con = fs.readFileSync("./xxx.html","utf-8"); //response(响应):提供了向客户端返回内容和数据的方法 //response.write:向客户端返回内容 //response.end:告诉服务器响应结束 response.write(con); response.end; }cookie(小饼干) 在浏览器保存一些数据(不安全),每次请求都会带过来,有限的(4k)
读取:发送:session 保存数据,保存在服务端(安全),无限的,基于cookie来实现的 隐患:session劫持
在浏览器中输入http://localhost:端口号/ 在浏览器中输入http://本机的IPv4地址(window+r 输cmd ->输入ipconfig):端口号/
res.write():是在页面上打印出数据 res.end():是结束服务
var http = require("http"), url = require("url"), fs = require("fs"); //创建一个服务 var server1 = http.createServer(function (req, res) { res.write("lalala"); res.end(); }); //为这个服务创建端口 server1.listen(180, function () { console.log('creat success'); }); var http = require("http"), url = require("url"), fs = require("fs"); //创建一个服务 var server1 = http.createServer(function (req, res) { //解析客户端请求地址中的文件目录名称以及传递给当前服务器的数据内容 var urlObj = url.parse(req.url, true), pathname = urlObj["pathname"], query = urlObj["query"]; //如果不加try catch,客户端请求资源文件不存在时,服务会终止 try{ var con = fs.readFileSync("." + pathname,"utf-8"); res.end(con); }catch(e){ res.end("request file is not find!"); } /*以下三种合并为上面情况 if(pathname === "/index.html"){ var con = fs.readFileSync("./index.html","utf-8");//Sync同步读取文件内容,aSync异步 res.end(con); return; } if(pathname === "/index1.css"){ con = fs.readFileSync("./index1.css","utf-8"); res.end(con); return; } if(pathname === "/index.js"){ con = fs.readFileSync("./index.js","utf-8"); res.end(con); return; }*/ }); //为这个服务创建端口 server1.listen(8080, function () { console.log('server is creat success,listening on 180 port!'); });客户端传递给服务端的内容和服务端传递给客户端的内容都属于HTTP报文 起始行 :请求起始行 响应起始行 首部 :请求首部 响应首部 通用首部(请求响应都) 自定义首部‘ 主体 : 请求主体 响应主体 在控制台中:network下,name 请求首部
响应首部 响应主体,请求主体 (1).客户端传递给服务器端数据
请求URL后面问号传参的方式 设置请求的首部 设置请求主体,把传递给服务器的内容放在请求主体中传递给服务器
(2).服务端传递给客户端数据
设置响应头信息 设置响应主体内容
保留了原生的功能,添加了一些方法(send),增强了原有功能 1.创建项目及使用:
express -e 项目名称 安装依赖cnpm i xxx,在package.json中查看 开启项目 :npm start -->变成node ./bin/www
2.目录
public :静态文件根目录,优先找静态页面 routes :路由模块目录,动态文件的目录 views :试图目录,存储所有的ejs
3.基本过程:
1.创建服务 var server = express(); 2.监听 server.listen(8080); 3.处理请求 server.get(‘地址’,function(req,res){}) server.post(‘地址’,function(req,res){}) **server.use(‘地址’,function(req,res){})**使用use前面的方法都可以接收
