Nodejs学习二(模块)

一、Http模块和Url模块

1.简单的http服务

// 用node构建一个web服务器:http模块
// http这个模块的职责就是帮你创建编写服务器的

// 1.加载http服务器
var http = require('http');
// 2.使用http.createServer()方法创一个web服务器
//  返回一个Server实例
var server = http.createServer();
// 3.服务器要干嘛?
//  提供服务:对数据的服务
//  发请求
//  接受请求
//  处理请求
//  给个反馈(发送响应)
//  注册request请求事件
//      当客户端请求过来,就会自动触发服务器的request请求事件,然后执行第二个参数:回调处理。
server.on('request',function () { 
    console.log('收到客户端的请求了。');
 })
//  4.绑定端口号,启动服务器
server.listen(3000,function () { 
    console.log('服务器启动成功,可以通过http://127.0.0.1.3000/')
 })

2.发送响应

var http = require('http');
// 创建一个服务,里面传入一个方法,其中有两个参数:request获取url传过来的信息,response给浏览器响应信息。
http.createServer(function (request, response) {
    // 设置响应头
    // 状态码:200;文件类型:html;字符集:utf8
    response.writeHead(200, { 'Content-Type': 'text/plain' });
    // 表示页面上面输出一句话并且结束响应

    console.log('收到客户端的请求了,请求路径是:' + request.url);

    response.end('Hello nodejs');
}).listen(8081); //端口

console.log('Server running at http://127.0.0.1:8081/');

3.案例

我们希望当请求不同路径的时候响应不同的结果

var http = require('http');
http.createServer(function (request, response) {
    // console.log('收到客户端的请求了,请求路径是:' + request.url);
    // response.write('Hello');

    // 上面的方法比较麻烦,推荐使用更简单的方式,直接end的同时发送响应数据
    // response.end('HELLO nodejs')


    // 根据不同的请求路径发送不同的响应结果
    // 1、获取请求路径
    //  req.url获取到的端口号之后的那一部分路径,也就是说所有的url都是以/开头的
    // 2、判断路径处理响应
    var url=request.url;
    if(url==='/')
    {
        response.end('index page');
    }
    else if(url==='/login')
    {
        response.end('login');
    }
    else{
        response.end('404 NOT FOUND');
    }
}).listen(3000,function () { 
console.log('Server running at http://127.0.0.1:3000/');
    
 }); //端口

二、核心模块

Node为JavaScript 提供了很多p务器级别的API,这些API绝大多数都被包装到了一个具名的核心模块中了。

例如文件操作的fs核心模块,http服务构建的http模块,path路径操作模块、os操作系统信息模块……

var fs = require('fs')

三、模块系统

在node中 没有全局作用域,只有模块作用域。

简单来说外部访问不到内部,内部也访问不到外部

//a.js
var foo='aaa'
require('./b.js')
console.log('foo的值是:',foo)//aaa

//b.js
console.log('b.js文件被加载执行了。')
var foo='bbb'

既然是模块作用域 那么如何让模块与模块之间进行通信?

require方法有两个作用:

1.加载文件模块并执行里面的代码

2.拿到被加载文件模块导出的接口对象

在每个文件模块中都提供了一个对象:exports进行挂载。

//a.js
// exports默认是一个空对象
var ret = require('./b')
console.log(ret)//{ foo: 'hello', add: [Function (anonymous)] }
console.log(ret.add(1,2))//3

//b.js
var foo = 'bbb'
exports.foo = 'hello'
exports.add = function (x, y) {
    return x + y
}
function add(x, y) {//此方法不会被a.js调用
    return x - y
}

三、fs模块

1.对文件夹的操作
const fs=  require('fs')


// 创建一个文件夹用mkdir()方法
// 第一个参数为 文件夹的名字,第二个参数为 回调函数 错误优先
fs.mkdir('logs',(err)=>{
    if(err)throw err
    console.log('文件夹创建成功')
})

// rename()方法可用于修改文件夹或文件的名字
// 第一个参数为 修改之前的文件夹路径,第二个参数为 修改之后的文件夹路径 第三个参数为回调函数
fs.rename('./logs','./log',(err)=>{
    if(err)throw err
    console.log('文件夹名字修改成功')
})

// rmdir()方法用于删除文件夹
// 第一个参数为 文件夹路径 第二个参数为回调函数
fs.rmdir('./log',()=>{
    console.log('文件夹删除成功')
})

// readdir()方法用于读取文件夹
// readFile()方法用于读取文件
fs.readdir('./logs',(err,result)=>{
    console.log(result)
})
2.对文件的操作
// writeFile()用于写文件 彻底覆盖
// appendFile()用于追加文件 不会覆盖原来的文件内容
// 第一个参数为 文件地址,第二个参数为 写入的内容,第三个参数为错误优先的回调函数
fs.writeFile('./logs/log1.log','hello \n world',(err)=>{
    console.log('写文件成功')
})
fs.appendFile('./logs/log1.log','hello \n world!!!!!!!!!!',(err)=>{
    console.log('追加文件成功')
})


// unlink()用于删除文件
fs.unlink('./logs/log1.log',(err)=>{
    console.log('文件删除成功')
})


// readFile()用于读文件
// 第一个参数为文件路径,第二个参数为编码格式,第三个参数为回调
//若不加编码格式,content的返回值为: <Buffer 68 65 6c 6c 6f 20 0a 20 77 6f 72 6c 64>
// 方法一:此时要在参数中加入utf-8 
fs.readFile('./logs/log1.log','utf-8',(err,content)=>{
    console.log(content)
})
// 方法二:toString()方法变为字符串
fs.readFile('./logs/log1.log',(err,content)=>{
    console.log(content.toString())
})
console.log('countinue1……')//最先出来
// 循环遍历目录
//1.创建目录
// for(var i=0;i<10;i++){
//     fs.writeFile(`./logs/log-${i}.log`,`log-${i}`,(err)=>{
//         console.log('done')
//     })
// }
//2.读取目录
function readDir(dir) {
    fs.readdir(dir, (err, content) => {
        // console.log(content)
        content.forEach((value, index) => {
            let joinDir = `${dir}/${value}`
            // console.log(index, value)
            fs.stat(joinDir, (err, stats) => {
                if (stats.isDirectory()) {
                    readDir(joinDir)
                } else {
                    fs.readFile(joinDir,(err,content)=>{
                        console.log(content.toString())
                    })
                }
            })

        })
    })
}

readDir('./logs')
// 4.watch()方法 监测文件变化
fs.watch('./logs/log-0.log',(err)=>{
    console.log('文件已改变')
})
3.异步方法

引例:

fs.readFile('./logs/log1.log',(err,content)=>{
    console.log(content.toString())
})
console.log('countinue1……')//最先出来

// 将上面的异步方法改为同步方法:
const content = fs.readFileSync('./logs/log1.log')
console.log(content.toString())
console.log('countinue2……')//之后出来

const fsPromises = require('fs').promises
    // 加分号的场景:小括号、中括号作为语句的第一行 
    ; (async () => {
        let result = await fsPromises.readFile('./logs/log1.log')
        console.log(result.toString())
    })()

四、sream模块和zlib

const fs = require('fs')
const zlib = require('zlib')

const gzip = zlib.createGzip()

const readstream = fs.createReadStream('./logs.txt')
const writestream = fs.createWriteStream('./logs.gzip')

readstream
    .pipe(gzip)
    .pipe(writestream)

// writestream.write(readstream)

五、readline模块

const readline = require('readline')

const rl = readline.createInterface({
    input:process.stdin,
    output:process.stdout
});

rl.question('你如何看待Node.js中文网?',(answer)=>{
    console.log(`感谢您的宝贵意见:${answer}`)
    rl.close()
})

六、crypto加密模块

const crypto = require('crypto')
const password = 'abc123'

// sha1加密算法 还可以选取md5加密算法
// digest() 为计算传入的所有数据的摘要值,其参数是编码方式,可以有 'hex'、'binary'或者'base64'
const hash = crypto
    .createHash('sha1')
    .update(password)
    .digest('hex')

console.log(hash)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值