在使用node之前先打开cmd,输入node-v和cnpm-v查看有没有安装node和cnpm以及安装的版本。
1.创建node服务器(使用http模块)
2.引入http模块
3.开始创建服务器
req 指代url信息
res 浏览器返回的响应信息
listen() port 端口号
4.启动服务器 node 服务器js文件的名称(例如:node Server.js)http://localhost:8000/; 自启动工具:nodejs服务器代码,修改之后需要重新启动服务器,如果不想手动启动,可以安装自启动工具。安装指令:cnpm install -g supervisor
启动服务指令:supervisor +服务器js文件名(例如:supervisor Server.js);
想要解析服务端路径上的值http://localhost:8000?id=1&name=zhangsan,请求url模块(url.parse()解析路径上的get传值,第二个参数为true时解析出来的数据是json)
var http = require("http");
var url=require("url");
var stu=require("./student");引入student.js
let server=http.createServer(function (req, res) {
//req只带url信息
//res指浏览器返回的响应信息
if (req.url != "/favicon.ico") {
//url.parse 解析路径上的get传值 true 解析出来的数据是json
let path=url.parse(req.url,true);
let data=path.query;
console.log(data.id,data.name);
//设置http响应头
res.writeHead(200, { "Content-Type": "text/html;charset=utf-8" });
let name=stu.name;
//给服务页面打印
res.write(name);
}
//请求完成之后 响应结束
res.end();
}).listen(8000);//端口号可以随便写,但是不能和已有的端口重复
console.log("http://192.168.7.252:8000");
//模块暴露出去
module.exports=server;
let stus={
name:"张三",
job:"学生"
}
//把模块暴露出去
module.exports=stus;
node js里面的模块
内置模块 http url fs 自定义模块 (外部的js文件 封装代码)
使用自定义模块 require() 相对路径的文件
//按照相对路径找文件 使用require()相对路径的文件
let server=require("./Server");
//node js可以自动找文件 在node_modules 里面去找(node_modules是依赖)
//可以不按照相对路径找文件 直接以文件名找文件
let fun=require("collection");
console.log(fun());
/*
第三方模块 得先在项目里面生成package.json 配置文件
cnpm init/npm init 普通生成
cnpm init --yes /npm install --yes
md5 第三方模块 加密 (单向加密)只加密不解密
先导入第三方加密包
md5加密 如果要比对值 按照加密之后的值进行比对
相同的值加密后是一样的
*/
let md5=require("md5-node");
console.log(md5(fun()));
console.log(md5("123"));
这是上面代码用到的collection文件
module.exports=function (){
var s="123";
return s;
}
文件系统
let app = require("Server/Server");//引入服务器文件 服务器文件的具体内容在下一段代码中
//引入fs模块 文件模块
let fs = require("fs");
/*
文件系统存在异步和同步
1。文件的读取
readFile 异步的 readFileSync 同步读取
readFile()两个参数:读取的文件路径 回调函数
非阻塞( 使用异步方法 读取和后续代码可以直接读) 阻塞(使用的是同步方法 等待读取完成之后 在去执行后续)
*/
app(function (req, res) {
res.writeHead(200, { "Content-Type": "text/html;charset=utf-8" });
res.write("服务启动");
/* let content = "";
let promise = new Promise(function (resolve) {
//读取服务端的文件
fs.readFile("./data.txt", function (err, data) {
if (err) throw err;
//console.log(data.toString());
//读取出来的数据文buffer 得toString();
content = data.toString();
resolve(content);
});
});
promise.then(function (res){
console.log(res);
}); */
//同步读取
/* let text=fs.readFileSync("./data.txt");
console.log(text.toString()); */
//打开文件 flags r 读取模式 r+ 读写模式
/* fs.open("./list/stu.txt","r+",function (err,fd){
if(err) throw err;
console.log("文件夹打开成功!",fd);
}); */
//stat 判断当前的文件是什么类型
/* fs.stat("./list", function (err, stat) {
if (err) throw err;
// stat stat 类对象 里面 文件相关判断的方法
//stat.isDirectory() 检测当前文件是否是目录
//stat.isFile() 检测当前文件是否是文件
console.log(stat.isFile(), stat.isDirectory());
}) */
//文件的写入writeFile异步写入writeFilesync同步写入
let data = "我是写入的数据---更新之后的数据-1\n";
/* fs.writeFile("./list/stu.txt",data,function (err){
if(err)
{
console.log("写入失败");
}
console.log("写入成功!");
}); *///每次写入都会把之前的内容进行覆盖
//同步写入 写入成功后无法看是否成功 只能从文件的内容 来确定是否写入成功
/* let su=fs.writeFileSync("./list/stu.txt",data);
console.log(su); */
//追加写入数据
追加数据时如果想在哪里换行就在哪里写\n
/* if (req.url == "/") {
fs.appendFile("./list/stu.txt", data, function (err) {
if (err) {
console.log("写入失败");
}
else {
console.log("写入成功!");
}
});
} */
/* if (req.url == "/") {
//数据较多 分段读取
//创建buffer 缓冲区
let buf = new Buffer.alloc(1024);//字节数
//经过测试汉字三个字节 -一个字节 回车两个字节
fs.open("./list/stu.txt", "r+", function (err, fd) {
if (err) throw err;
console.log("文件打开完成");
//read 方法读取
fs.read(fd, buf, 0, buf.length, 0, function (error, buffer) {
if (error) throw error;
console.log(buf.slice(0, buffer).toString());
//读取完成之后 关闭文件流
fs.close(fd, function (cerr) {
if (cerr) throw cerr;
console.log("文件关闭完成");
});
});
})
//fs.readFile(); fs.readFileSync() 直接一次性读取完成
//fs.read可以像读那一段就读那一段
} */
//创建目录
/* if (req.url == "/") {
fs.mkdir("./list/sub", function (err) {
if (err) throw err;
console.log("创建成功");
});
} */
//单文件件创建 可以直接使用写入流 创建文件 如果写入的文件没有就会自己创建
//读取目录
if (req.url == "/") {
fs.readdir("./list/sub", function (err, files) {
if (err) {
throw err;
}
//读取的目录文件进行遍历
for (let key in files) {
fs.stat("./list/sub/" + files[key], function (error, stat) {
if (error) {
throw error;
}
//console.log(stat.isFile());
console.log(stat.isDirectory());
});
}
});
}
res.end();
});
server文件
module.exports = function (app) {
let http = require("http")
http.createServer(app).listen(3100);
};
读取流事件
- data - 当有数据可读时触发。
- end - 没有更多的数据可读时触发。
- error - 在接收和写入过程中发生错误时触发。
- finish - 所有数据已被写入到底层系统时触发。
//加载 fs模块
var fs = require("fs");
module.exports = function () {
//读取流事件 readable
// data error finish end
var promise = new Promise(function (resolve) {
var result = "";
//读取流 创建读取流
var readStream = fs.createReadStream("./data.txt");
//设置流文件编码格式
readStream.setEncoding("utf-8");
//触发事件
//data 事件 当有可读的数据的时候触发的事件
readStream.on("data", function (res) {
//console.log(res.toString());
result += res;
});
//end事件 当没有数据可读的时候触发事件
readStream.on("end", function () {
//输出所有的流数据
console.log(result);
resolve(result);
});
//error 在流读取的时候 出现异常 读取失败
readStream.on("error", function (err) {
if (err) {
throw err;
}
});
});
promise.then(function (res) {
//写入流 writeable
//创建写入流
//单文件创建 text.txt 可以直接使用写入流 创建文件 写入的文件没有 会自动创建
/* fs.writeFile("./list/text.txt","",function (error){
if(error)
{
throw error;
}
console.log("创建文件成功");
}); */
var txt = res;
//创建写入流
var writeStream = fs.createWriteStream("./list/text.txt");
//设置写入流的编码格式
//写入数据
writeStream.write(txt, "utf-8");
//写关闭流 ---写入流关闭之后 触发finish事件
writeStream.end();
//写入流 执行完成 finish
writeStream.on("finish", function () {
console.log("数据写入完成!");
});
});
}
管道流
var http = require("http");
var emit = require("./Emit");
var fs = require("fs");
http.createServer(function (req, res) {
if (req.url != "/favicon.ico") {
res.writeHead(200, { "Content-Type": "text/html;charset=utf-8" });
//管道流 pipe 边读边写
//创建读取流
var readStream = fs.createReadStream("./js原生ajax.docx");
var writeStream = fs.createWriteStream("./list/text.txt");
readStream.pipe(writeStream);
res.write("服务器");
}
res.end();
}).listen(8100);
event事件车 发布和订阅
node事件广播在整个node项目中都可以使用 这样使用只能new一次要保持对象的唯一,
on相当于事件的监听,事件的发布可以重复,在监听的时候没办法控制订阅的次数;除了on事件监听之外,addListener(event,listener)去写监听
event事件的触发机制是 先订阅再发布,没有这个时间的时候也可以对其订阅,当这个时间突然发布,这边就可以订阅到
1.once对于当前的订阅只触发一次监听;
2.on之类的监听事件也可以移除,removeListener(event,listener)
var http = require("http");
var stream = require("./stream");
var emit = require("./Emit");
//挂载两个js a b
var event = require("events");
var Emit = new event.EventEmitter();
var a = require("./a");
var b = require("./b");
var fs = require("fs");
http.createServer(function (req, res) {
if (req.url != "/favicon.ico") {
res.writeHead(200, { "Content-Type": "text/html;charset=utf-8" });
//执行流文件
//stream();
//emit();
b(Emit);
a(Emit);
res.write("服务器");
}
res.end();
}).listen(8100);
a文件
module.exports=function (event){
//发送广播
event.emit("sendData","123");
}
b
module.exports=function (event){
//接收广播
event.on("sendData",function (res){
console.log(res);
});
}