node学习

全局模块

process.env 环境变量

process.argv 命令行变量
例如:

//命令行输入
node index 11 22
//index.js
console.log(process.argv) //['.../node.exe'(node文件目录),'.../index'(当前文件目录),11,22]
console.log(parseInt(process.argv[2])+parseInt(process.argv[3])) //33

__dirname 当前的目录

系统模块

需要require(),但不需要下载

path:用于处理文件路径和目录路径的使用工具

let path = require('path')

console.log(path.dirname('/node/a/b/1.jpg')) // 目录路径(/node/a/b/)
console.log(path.basename('/node/a/b/1.jpg')) // 文件(1.jpg)
console.log(path.extname('/node/a/b/1.jpg')) // 文件扩展名(.jpg)
console.log(path.basename('/node/a/b/1.jpg', path.extname('/node/a/b/1.jpg'))) // 文件名(1)

核心应用:

//index.js
let path = require('path')

console.log(path.resolve('/node/a/b','../../','c')) // node\c
console.log(path.resolve(__dirname,'index.js')) // 获取到文件的绝对路径,避免用相对路径出错

fs:用于文件的读写操作

读:

//a.txt
abc
//index.js
let fs = require('fs')

fs.readFile('a.txt',(err,data)=>{
	if(err){
		console.log(err)
	}else{
		console.log(data) //<Buffer 61 62 63>
		console.log(data.toString()) //abc
	}
})
//同步写法
let data2 = fs.readFireSync('a.txt')
console.log(data2)

写:

//index.js
let fs = require('fs')
//覆盖写
fs.writeFile('b.txt','月薪2000元',(err)=>{
	if(err){
		throw err
	}else{
		console.log('写入成功') 
	}
})
//追加写
fs.writeFile('b.txt','月薪4000元',{flag:'a'},(err)=>{
	if(err){
		throw err
	}else{
		console.log('写入成功') 
	}
})

//同步写法
fs.writeFileSync('b.txt','月薪4000元')

自定义模块

require

  1. 如果有路径就去路径里面找
  2. 没有的话就去node_modules里面找
  3. 最后再去node的安装目录里面找

exports:导出
module:批量

//mod.js
//exports.a = 'a'
//exports.b = 'b'
//上面的导出等于下面的导出
module.exports = {
	a:'a',
	b:'b'
}
//index.js
const mod = require('./mod.js')
console.log(mod.a)//'a'
console.log(mod.b)//'b'

重点:HTTP 模块

//index.js
let http = require('http')
let fs = require('fs')

http.createServer((req,res)=>{
    console.log('req',req)
    fs.readFile(`./${req.url}`,(err,data)=>{
        if(err){
            res.writeHead(404)
            res.end('404 not found')
        }else{
            res.writeHead(200)
            res.end(data)
        }
    })
}).listen(8888)

GET 请求

//index.js
let http = require('http')
let url = require('url')

http.createServer((req,res)=>{
    console.log('req.url',req.url)
    //url.parse 第一个参数是请求路径 第二个参数是是否要处理query,不处理则是拼接的字符串
    let {pathname,query} = url.parse(req.url,true)
    console.log(pathname,query)
}).listen(8888)
<!-- form.html -->
<form action="http://localhost:8888/login">
    用户名: <input type="text" name="username">
    <br>
    密码:<input type="password" name="password">
    <br>
    <input type="submit" value="提交">
</form>
  • url?user=xxx&pass=xxx
  • <32K
  • url模块
  • url.parse(req.url,true)

POST 请求

//index.js
let http = require('http')
let querystring = require('querystring')

http.createServer((req, res) => {
    let result = []
    req.on('data', buffer => {
        result.push(buffer)
    })
    req.on('end', () => {
        let data = Buffer.concat(result).toString() //因为是接收字符串,所以可以直接tostring
        console.log(querystring.parse(data))
    })
    res.end('success')
}).listen(8888)
<!-- form.html -->
<form action="http://localhost:8888/login" method="POST">
    用户名: <input type="text" name="username">
    <br>
    密码:<input type="password" name="password">
    <br>
    <input type="submit" value="提交">
</form>
  • 数据一般放在body请求体里,数据比较大,所以是一段一段接收的
  • < 2G
  • querystring
  • querystring.parse(data)

综合实例

目录结构如下图:
实例目录

//index.js
let http = require('http')
let fs = require('fs')
let url = require('url')
let querystring = require('querystring')
const users = {
    'admin': '123456'
}

http.createServer((req, res) => {
    let path, postQuery, getQuery;
    if (req.method === 'GET') {
        let { pathname, query } = url.parse(req.url, true)
        path = pathname
        getQuery = query
        cb()
    } else if (req.method === 'POST') {
        path = req.url
        let result = []
        req.on('data', buffer => {
            result.push(buffer)
        })
        req.on('end', () => {
            postQuery = querystring.parse(Buffer.concat(result).toString())
            cb()
        })
    }

    function cb() {
        if (path === '/login') {
            res.writeHead(200, {
                'Content-Type': 'text/plain;charset=utf-8'
            })
            let { username, password } = getQuery

            if (!users[username]) {
                console.log('用户不存在')
                res.end(JSON.stringify({
                    code: 401,
                    msg: '用户不存在'
                }))
            } else if (users[username] != password) {
                res.end(JSON.stringify({
                    code: 401,
                    msg: '密码不正确'
                }))
            } else {
                res.end(JSON.stringify({
                    code: 0,
                    msg: '登录成功'
                }))
            }
        } else if (path === '/reg') {
            res.writeHead(200, {
                'Content-Type': 'text/plain;charset=utf-8'
            })
            let { username, password } = postQuery

            if (users[username]) {
                res.end(JSON.stringify({
                    code: 401,
                    msg: '用户已存在'
                }))
            } else {
                users[username] = password
                res.end(JSON.stringify({
                    code: 0,
                    msg: '注册成功'
                }))
            }
        } else {
            fs.readFile(`www${path}`, (err, data) => {
                if (err) {
                    res.writeHead(404)
                    res.end('404')
                } else {
                    res.end(data)
                }
            })
        }
    }
}).listen(8080)
<!-- login.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="jquery.min.js"></script>
</head>
<body>
        用户名: <input type="text" id="username">
        <br>
        密码:<input type="password" id="password">
        <br>
        <button id="login">提交</button>
        <br>
        <button id="reg">注册</button>

        <script >
            (function(){
                $('#login').click(function(){
                    console.log('login click')
                    $.ajax({
                        url:'/login',
                        method:'get',
                        dataType:'json',
                        data:{
                            username:$('#username').val(),
                            password:$('#password').val()
                        },
                        success(res){
                            if(res.code!==0){
                                alert(res.msg)
                            }else{
                                alert('登录成功')
                                location.href="index.html"
                            }
                        }
                    })
                })
                $('#reg').click(function(){
                    console.log('reg click')
                    $.ajax({
                        url:'/reg',
                        dataType:'json',
                        method:'post',
                        data:{
                            username:$('#username').val(),
                            password:$('#password').val()
                        },
                        success(res){
                            if(res.code!==0){
                                alert(res.msg)
                            }else{
                                alert('注册成功')
                            }
                        }
                    })
                })
            })()
        </script>
</body>
</html>

总结

作用:

  1. 写webApi
  2. 中间层
  3. 前端工程化的一些(webpack、gulp)

深入:koa2/express、MongoDB/mysql 等

进阶

nodemon模块 热更新,采用nodemon替代node执行命令,通过增加nodemon.json的watch增加监听的文件

DEBUG=*

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值