在使用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);
};

读取流事件

  1. data - 当有数据可读时触发。
  2. end - 没有更多的数据可读时触发。
  3. error - 在接收和写入过程中发生错误时触发。
  4. 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);
    });
}