Node.js常用知识

Nodejs

总结Node.js基础知识,便于定期回顾

1、fs

文件写入

1、require('fs')

2、fs.writeFile()

3、fs.appendFile()

4、fs.createwriteStream() //流式写入

ws.write()

文件读取

1、fs.readFile('',(err,data)=>{

})

C# 复制代码
const fs=require('fs')
fs.readFile("D:/Node/Data.txt",(err,data)=>{
    console.log(data.toString())
})

2、流式读取

js 复制代码
const rs=fs.createReadStream('./观书有感.txt')
rs.on('data',chunk=>{
  console.log(chunk)
})
rs.on('end',()=>{
    console.log("读取完成");
})

3、边取边存。

js 复制代码
const fs=require('fs');

const rs=fs.createReadStream('./观书有感.txt');
const ws=fs.createWriteStream('./观书有感2.txt');

rs.on('data',chunk=>{
    ws.write(chunk);
})

rs.on('end',()=>{
    console.log('执行完成')
})

也可以

js 复制代码
rs.pipe(ws)

3、内存占用大小

JS 复制代码
console.log(process.memoryUsage)

4、文件重命名和移动

js 复制代码
fs.rename('./座右铭.txt','./论语.txt',err=>{
    console.log(完成);
});

5、删除文件

js 复制代码
//方法一:使用异步回调方法 fs.unlink()
const fs = require('fs');

fs.unlink('./观书有感2.txt', (err) => {
    if (err) {
        console.error("文件删除失败:", err);
        return;
    }
    console.log("文件删除成功");
});
//方法二:使用同步方法 fs.unlinkSync()
const fs = require('fs');

try {
    fs.unlinkSync('./观书有感2.txt');
    console.log("文件删除成功");
} catch (err) {
    console.error("文件删除失败:", err);
}

6、创建对象

js 复制代码
const fs=require('fs');
fs.mkdir('./html',err=>{
    console.log("创建成功");
});

7、递归创建文件

js 复制代码
fs.mkdir('./A/B/C',{recursive:true},err=>{
    console.log("创建成功");
})

//删除文件
fs.rm('./')

8、读取文件夹

js 复制代码
fs.readdir('./A',(eer,data)=>{
    if(eer){
        console.log("读取失败");
        return;
    }
    console.log(data);
});

9、删除文件夹

js 复制代码
//递归删除
fs.rmdir('./A',{recursive:true},err=>{
    
})

//建议使用
fs.rm('./A',{recursive:true},err=>{
    
})

10、查看资源状态

js 复制代码
fs.stat('./A',(err,data)=>{    //旧方法fs.exists
    if(err){
        console.log('操作失败')
        return;
    }
    console.log(data)
})

11、__dirname

绝对路径 '全局变量' 保存的是所在文件的所在目录的绝对路径。

js 复制代码
fs.writeFile(__dirname+'/index.html')

12、Path

C# 复制代码
const path=require('path')
console.log(path.resolve(__dirname,'./index.html'));  //该方法将一些的 路径/路径段 解析为绝对路径
console.log(__filename)  //打印文件的绝对路径;
path.parse(str) //解析路径并返回对象
path.basename() 获取路径的基础名称
path.dirname() 获取路径的目录名
path.extname() 获取路径的扩展名
    

2、HTTP

1、响应状态码

200 请求成功

403 禁止请求

404 找不到资源

500 服务器内部错误
1xx 信息响应

2xx 成功响应

3xx 重定向消息

4xx 客户端错误响应

5xx 服务端错误响应

2、本地回环

127.0.0.1

3、Http协议默认端口是80,HTTPS协议默认端口是443,HTTP服务开发常用端口有3000,8080,8090,9000

4、获取请求HTTP报文

js 复制代码
const http=require('http')
const server=http.createServer((request,response)=>{
    response.setHeader('content-type','text/html;charset=utf-8');
    //获取请求的方法
    console.log(request.method)
    //获取请求的URl
    console.log(request.url)//只包含url中的路径与查询字符串
    //获取http协议版本号
    console.log(request.httpVersion);
    //获取请求头
    console.log(request.headers)
    response.end('你好');
})
server.listen(9000,()=>{
    console.log("服务已经启动...");
})

res.writeHead(200, { 'Content-type': 'text/html;charset=utf-8' })

response.setHeader('content-type','text/html;charset=utf-8');
express框架中用req.body接收post客户端的数据,req.query接收get请求

http中

nodejs 复制代码
req.setEncoding('utf-8');
req.on('data',function(data){
	console.log(data)
})
req.on('end')

5、获取Http报文中的URL路径与查询字符串

js 复制代码
const http=require('http')
const url=require('url');
const server=http.createServer((request,response)=>{
    let res=url.parse(request.url,true) //获取url
    let pathname=res.pathname         //获取url的名称
    let keyword=res.query.keyword; //获取url的keyword
    console.log(keyword)
    response.end('url')
})
server.listen(9000,()=>{
    console.log("服务已经启动...");
})

推荐使用的方法

js 复制代码
const http=require('http')
const server=http.createServer((request,response)=>{
   //实例化URL的对象
    let url=new URL(request.url,'http://127.0.0.1');
    //输出路径
    console.log(url.pathname);
    //输出keyword查询字符串
    console.log(url.searchParams.get('keyword'));
    response.end('url');
})
server.listen(9000,()=>{
    console.log("服务已经启动...");
})

6、练习 request

js 复制代码
const http=require('http')
const server=http.createServer((request,response)=>{
    response.setHeader('content-type','text/html;charset=utf-8')
    let {method}=request;
    let {pathname}=new URL(request.url,'http://127.0.0.1')
    console.log(method);
    console.log(pathname);
     if(method=='GET'&&pathname=='/login'){
        response.end("登陆页面")
     }else if(method=='GET'&&pathname=='/reg'){
        response.end('注册页面')
     }else{
        response.end('啥也没有')
     }
})
server.listen(9000,()=>{
    console.log("服务已经启动")
})

7、练习、response

response.end 有且只有一个,可以使用response.write写很多内容

8、读取html

js 复制代码
const http=require('http')
const fs=require('fs')
const server=http.createServer((request,response)=>{
    response.setHeader('content-type','text/html;charset=utf-8');
    let html=fs.readFileSync('./test.html');
    response.end(html)
});
server.listen(9000,()=>{
    console.log('服务器启动')
})

9、读取css

js 复制代码
const http = require('http')
const fs = require('fs')
const server = http.createServer((request, response) => {
    //response.setHeader('content-type', 'text/html;charset=utf-8');
    
    let {pathname}=new URL(request.url,'http://127.0.0.1');
 
    if(pathname=='/'){
        console.log(pathname)
        let html = fs.readFileSync(__dirname+'/test.html');
        response.end(html)
    }else if(pathname=='/table.css'){
        console.log(pathname)
        let css = fs.readFileSync(__dirname+'/table.css');
        response.end(css)
    }else{
        response.statusCode=404;
        response.end(`<h1>404 not found</h1>`)
    }
  
   
});
server.listen(9000, () => {
    console.log('服务器启动')
})

10、静态文件搭建

js 复制代码
const http = require('http')
const fs = require('fs')
const server = http.createServer((request, response) => {
    //response.setHeader('content-type', 'text/html;charset=utf-8');
    
    let {pathname}=new URL(request.url,'http://127.0.0.1');
    
    let filepath=__dirname+pathname;

    fs.readFile(filepath,(err,data)=>{
        if(err){
            response.statusCode=500;
            response.end('文件读取是被~~');
            return;
        }
        response.end(data)
    })
    
});
server.listen(9000, () => {
    console.log('服务器启动')
})

10、mime 媒体类型

加不加都可以,加上更规范

js 复制代码
let mimes={
    html:'text/html',
    css:'text/css',
    js:'text/javascripts',
    png:'image/png',
    jpg:'image/jpeg',
    gif:'image/gif',
    mp4:'video/mp4',
    mp3:'audio/mpeg',
    json:'application/json'
}
fs.readFile(filepath,(err,data)=>{
        if(err){
            response.statusCode=500;
            response.end('文件读取是被~~');
            return;
        }
    
        //获取文件的后缀名
        let ext=path.extname(filepath);
        let type=mimes[ext]
        if(type){
            response.setHeader('content-type',type+';charset=utf-8') //同时解决乱码问题
        }else{
            response.setHeader('content-type','application/octet-stream');
        }
    /
        //响应文件内容
        response.end(data)
    })

3、模块化


1、暴露数据

js 复制代码
function tiemo(){
    console.log('贴膜...');
}
function Fun(){
    console.log('yes...');
}
//暴露数据方法一
//exports.tiemo=tiemo;
//exports.Fun=Fun;
//module.exports可以暴露任何值
module.exports={
    tiemo,
    Fun
}

///获取数据

//导入模块
const ms=require('./me.js');
ms.tiemo();
ms.Fun();

 

2、package.json

js 复制代码
{
    "main":"./app.js"
}

const me=require('./mode')  //mode是一个文件夹 package.json在文件夹下面
console.log(me)

如果package.json不存在,则会尝试导入文件夹下的index.js和index.json

4、包管理工具


1、npm初始化

js 复制代码
npm init

2、npm资源网址

npm (npmjs.com)

3、生产依赖和开发依赖

js 复制代码
npm i -S uniq   ------npm i --save uniq          生产
npm i -D less   ------npm i --save-dev less      开发

4、全局安装包的位置

使用 npm root -g 查看

5、npm i

刚拉下来的项目是不能启动的,首先需要npm i一下

6、删除包

npm r 包名

7、配置别名

js 复制代码
{
  "name": "test",
  "version": "1.0.0",
  "description": "学习npm",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "server":"node ./Npms/.index.js" ================在这个位置
         "start": "node ./Npms/index.js",
  },
  "author": "",
  "license": "ISC"
}

后面运行的话,使用npm run server

如果是start,使用npm start。

8、cnpm

npmmirror 镜像站

9、配置npm淘宝镜像

1、安装nrm

js 复制代码
npm i -g nrm

2、修改镜像

js 复制代码
nrm use taobao

3、检查是否配置成功

js 复制代码
npm config list

nrm ls 可以列出支持的镜像地址

10 、yarn

安装

js 复制代码
npm i -g yarn

配置镜像

11、报错

如果在运行期间,报错 (因为在此系统上禁止运行脚本)。

解决方法:管理员打开powershell ,运行set-ExecutionPolicy RemoteSigned 点击Y确认。

这是更改计算机的执行策略。

12、 查看配置

js 复制代码
yarn config list

13、包管理工具不能混用

14、如果想发布包的话

要用 nrm use npm 修改回来镜像

11、NVM

可以很方便的帮我们切换nodejs版本

5、Express


js 复制代码
 npm install express

初体验

js 复制代码
//1、导入express
const express=require('express')

//2.创建应用对象
const app=express()

//3、创建路由
app.get('/home',(req,res)=>{
    
    res.end('hello express')
})
//4、监听端口,启动服务
app.listen(3000,()=>{
    console.log('服务已经启动,端口3000正在监听')
})
js 复制代码
app.post('/login',(req,res)=>{
    res.end('Post')
})
app.all('/test',(req,res)=>{
    console.log("执行")
    res.end('执行')
})
//最后找不到 就执行这个
app.all('*',(req,res)=>{
    console.log("执行")
    res.end('执行')
})
js 复制代码
app.get('/request',(req,res)=>{

    console.log(req.httpVersion);
    console.log(req.method)
    console.log(req.headers);
    console.log(req.url)
    console.log(req.path)
    console.log(req.query)
    console.log(req.ip)
    //获取请求头
    console.log(req.get('host'))
    res.end('hello express')
})

2、路由参数获取

js 复制代码
app.get('/:id.html',(req,res)=>{
    console.log(req.params.id)  //params相当于所有参数
    res.end("shang pin lie biao")
})

3、express 对于json的读取

js 复制代码
//1、导入express
const express=require('express')
const {singers}=require('./singer.json')   //使用解构赋值可以使导出的js变成一个对象,而不是数组。
//2.创建应用对象
const app=express()
console.log(singers)
app.get('/request',(req,res)=>{

    console.log(req.httpVersion);
    console.log(req.method)
    console.log(req.headers);
    console.log(req.url)
    console.log(req.path)
    console.log(req.query)
    console.log(req.ip)
    //获取请求头
    console.log(req.get('host'))
    res.end('hello express')
})

app.get('/ .html',(req,res)=>{
    
    let {id}=req.params;
    let result =singers.find(item=>{
        if(item.id===Number(id)){
            return true;
        }
    });
    console.log(result)
})

//4、监听端口,启动服务
app.listen(3000,()=>{
    console.log('服务已经启动,端口3000正在监听')
})

4、一般响应设置

js 复制代码
 //原生响应
    res.statusCode=404;
    res.statusMessage='love';
    res.setHeader('xxx','yyy')
    res.write('hello express')  //的返回数据是没有经过处理的,原封不动的返回原数据,所见即所得.与res.end成对出现。
								//可以执行多次
    res.end('response')       //不允许多次输入

    //express响应
    res.status(500);
    res.set('aaa','bbb');
    res.send('你好')
    res.status(500).set('abc','def').send('thisisok')

5、

js 复制代码
app.get('/home',(req,res)=>{
    //跳转响应 重定向
    //res.redirect('https://www.baidu.com/')
    //下载响应
    //res.download(__dirname+'/singer.json');
    //Json响应
    res.json({
        name:'ok',
        slogin:'YuYu'
    })
    //响应文件内容
    res.sendFile(__dirname+'/test.html');
})

6、中间件的使用

js 复制代码
const express=require('express');
const fs=require('fs')
const app=express();
const path=require('path')
function Midd(req,res,next){
    let {url,ip}=req;
    fs.appendFileSync(path.resolve(__dirname,'./access.log'),`${url}  ${ip}\r\n`)
    next();
}
app.use(Midd)  //这种是作用全局
app.get('/home',(req,res)=>{
    res.send("前台首页")
})
app.get('login',(req,res)=>{
    res.send("后台首页")
})

第二种 类似于局部使用

js 复制代码
const { application } = require('express');
const express=require('express')
const app=express();
app.get('/home',(req,res)=>{
    res.send('首页')
})
function Mindd(req,res,next){
    if(req.query.code==='521'){
        next()
    }else{
        res.send('code有问题')
    }
}
app.get('/admin',Mindd,(req,res)=>{
    res.send('登陆界面')
})
app.get('/setting',Mindd,(req,res)=>{
    res.send('设置界面')
})
app.listen(3000,()=>{
    console.log('服务器监听中。')
})

7、静态资源中间件

js 复制代码
//静态资源中间件设置
app.use(express.static(__dirname+'/public'))

问题 路由和静态资源的优先问题

当app.get('/')时,直接http://127.0.0.1:3000/可以访问,也可以访问index.html, 他俩的优先级是啥。

按照自上而下的顺序。

路由响应动态资源,静态资源中间件响应静态资源。

8、请求体

js 复制代码
const express=require('express');
const bodyParser = require('body-parser')
const app=express();
// create application/json parser
//const jsonParser = bodyParser.json()

// create application/x-www-form-urlencoded parser
const urlencodedParser = bodyParser.urlencoded({ extended: false })

app.get('/login',(req,res)=>{
    res.sendFile(__dirname+'/form.html')
})
app.post('/login',urlencodedParser,(req,res)=>{
    console.log(req.body)
    res.send('获取用户的数据')
})
app.listen(3000,()=>{
    console.log('服务器运行中...')
})

9、防盗链

防止外部网站盗用本网站内容

js 复制代码
const express=require('express')

const app=express();

app.use((req,res,next)=>{

    let referer=req.get('referer');
    if(referer){
        let url=new URL(referer);
        let hostname=url.hostname;
        if(hostname!=='127.0.0.1'){
            res.status(404).send('<h1>404 Not Found</h1>')
            return;
        }
    }

    next();
})

app.use(express.static(__dirname+'/public'));
 
app.listen(3000,()=>{
    console.log("服务器已经启动,端口3000.。。")
})

10、路由的模块化

js 复制代码
const express = require('express')
const adminRouter=require('./routes/adminRouter');
const loginRouter=require('./routes/loginRouter')
const app = express();
//设置
app.use(adminRouter);
app.use(loginRouter);
app.listen(3000, () => {
    console.log("服务器执行。。。。")
})
---------------------------------------------------
const express =require('express');
const router=express.Router();
router.get('/login', (req, res) => {
    console.log('login执行')
    res.send('login执行');
})
module.exports=router;

11、模版引擎

模版引擎是分离用户界面和业务数据的一种技术

相关推荐
豐儀麟阁贵5 分钟前
8.5在方法中抛出异常
java·开发语言·前端·算法
zengyuhan50335 分钟前
Windows BLE 开发指南(Rust windows-rs)
前端·rust
醉方休38 分钟前
Webpack loader 的执行机制
前端·webpack·rust
前端老宋Running1 小时前
一次从“卡顿地狱”到“丝般顺滑”的 React 搜索优化实战
前端·react.js·掘金日报
隔壁的大叔1 小时前
如何自己构建一个Markdown增量渲染器
前端·javascript
用户4445543654261 小时前
Android的自定义View
前端
WILLF1 小时前
HTML iframe 标签
前端·javascript
枫,为落叶1 小时前
Axios使用教程(一)
前端
小章鱼学前端1 小时前
2025 年最新 Fabric.js 实战:一个完整可上线的图片选区标注组件(含全部源码).
前端·vue.js
ohyeah1 小时前
JavaScript 词法作用域、作用域链与闭包:从代码看机制
前端·javascript