nodejs 入门基本操作
const path = require("path");const fs = require("fs");/*相对路径是命令窗口执行的目录node 提供了path模块来操作路径相关的api, 其中__dirname是一个内置的变量,返回当前文件所在的目录*/const getDirUrl = dir => { return path.resolve(__dirname, dir);};for (let i = 0; i < 5; i++) { fs.writeFileSync(getDirUrl("./create01.text"), i + "、我是测试数据" + i + "\n", { flag: "a+", encoding: "utf-8" });}console.log("hello nodejs");const data = fs.readFileSync(getDirUrl("./create01.text"), {encoding: "utf-8"}).toString()console.log("同步读取")console.log(data)console.log("异步读取")fs.readFile(getDirUrl("./create01.text"), (err, data) => { if(!err) { console.log(data.toString()); } else { console.error(err); }});
在窗口执行对应的目录即可,我这里是:
(相关资料图)
// 1. 导入http模块const http = require("http");const fs = require("fs");const path = require("path");const mimes = { html: "text/html", css: "text/css", js: "text/javascript", png: "image/png", jpg: "image/jpeg", gif: "image/gif", mp4: "video/mp4", mp3: "audio/mpeg", json: "application/json"};//2. 创建服务对象 create 创建 server 服务// request 意为请求. 是对请求报文的封装对象, 通过 request 对象可以获得请求报文的数据// response 意为响应. 是对响应报文的封装对象, 通过 response 对象可以设置响应报文const server = http.createServer((req, res) => { let { url, method } = req; // 文件夹路径 const rootDir = __dirname + "/public"; let filePath = rootDir + url; if (!fs.existsSync(filePath)) { return } // 读取内容 fs.readFile(filePath, (err, data) => { if (err) { console.log(err); //设置字符集 res.setHeader("content-type","text/html;charset=utf-8"); //判断错误的代号 switch(err.code){ case "ENOENT": res.statusCode = 404; res.end("404 Not Found
"); case "EPERM": res.statusCode = 403; res.end("403 Forbidden
"); default: res.statusCode = 500; res.end("500 Internal Server Error
"); } return; } //获取文件的后缀名 let ext = path.extname(filePath).slice(1); //获取对应的类型 let type = mimes[ext]; if(type){ if(ext === "html"){ res.setHeader("content-type", type + ";charset=utf-8"); }else{ res.setHeader("content-type", type); } }else{ //没有匹配到-默认设置二进制文件类型 res.setHeader("content-type", "application/octet-stream"); } //响应文件内容 res.end(data); });});//3. 监听端口, 启动服务server.listen(9000, () => { console.log("服务已经启动,9000端口监听中...");});
如上最简单的http 服务起来了,在浏览器中 输入 http://localhost:9000/index.html 得到如下页面
通过匹配后缀,在public文件中返回对应的资源,代码结构如下
都是一些很简单的代码就不贴了,如果需要留下邮箱
即可。
其他模块看看官网的文档即可,不在记录。
框架上面都是通过原始的方式来使用node,其实node的生态也很丰富,有很多的框架让我们选择,如 express、koa2、nestjs、midwayjs 等等
express 基本使用
// 1.0 导入expressconst express = require("express")// 2.0 express 实例const app = express()const port = 9000// 3.0 路由app.get("/", (req, res) => { res.send("基本使用 Hello World!")})// 启动服务app.listen(port, () => { console.log(`启动服务,端口: ${port}`)})
通常我们使用脚手架,这样可以得到统一的项目结构 如 express_ generator,具体查看express 官网
中间件-洋葱模型目前比较流行的 nodejs http 服务框架使用拦截器模式,这种模式将 http 请求响应的过程分为若干切面,每个切面上进行一项或若干项关联的操作。比如说,我们可以通过不同的拦截切面处理用户信息验证、会话(session)验证、表单数据验证、query 解析,或者业务逻辑处理等等。这种架构设计让切面与切面之间彼此独立。
有点面向切面编程的概念,不知道对不对。
手动实现一个拦截器:实现类似如下效果
async (ctx, next) => { do sth...}
通过调用next
执行下一个函数,可以中途return
退出,也可以继续调用next
直到最后一个函数,然后在一层一层的返回,洋葱的结构跟这个类似,所以叫洋葱模型。
这里的中间件其实是一个函数,在外层使用use 注入进来。
执行第一个中间件的fn,调用next 进入到下一个中间件,继续执行下一个fn,调用next 友进入下一个中间件,继续重复上述逻辑,直至最后一个中间件,直至最后一个中间件,就会执行next
语句后面的代码,然后继续上一个中间件的next
后置语句,继续重复上述逻辑,直至执行第一个中间件的next
后置语句,最后输出,这个执行的机制,称为洋葱模型
。模拟洋葱模型洋葱模型关键在于怎么处理next 参数,next是下一个函数的引用, ,可以通过我们索引加闭包,或者累加器的形式来处理,为了方便直接使用累加器的形式即可,如下代码:
/* 这个思路通过利用累加器函数的特性,返回一个函数*/class Interceptor { aspects = []; use (fn) { this.aspects.push(fn) return this } async run (context) { // 从右往左开始遍历 const proc = this.aspects.reduceRight( function (a, b) { let flag = false return async () => { // a 上一个fn,也就是调用的时传入的 next if (flag) { return } flag = true await b(context, a) } },() => Promise.resolve()) try { // 通过这个reduceRight 让函数串起来了 await proc() } catch (e) { console.error(e); } }}// 测试const inter = new Interceptor()inter.use(function a(context, next) { console.log("a"); next(); console.log("a_after");});inter.use(function b(context, next) { console.log("b"); next(); console.log("b_after");});inter.use(function c(context, next) { console.log("c"); next(); console.log("c_after");});inter.use(function d(context, next) { console.log("d"); next(); console.log("d_after");});inter.run();
输出a、b、c、d、d_after、c_after、b_after、a_after 其中koa2 源码中使用了索引加闭包的形式来处理 源码
小结理解了nodejs 写起来还是挺顺手的,官网文档也还好。至于其他如sql
、路由
、保持会话状态
等后台基本知识点,看看相关文档即可,并没有什么难度。
nodejs 入门基本也结束了。
标签:
推荐
- nodejs 入门基本操作
- 国家统计局:2023年4月份规模以上工业增加值同比增长5.6%
- 26次登顶珠峰!这名夏尔巴人是世界第二人|当前聚焦
- 世界短讯!中国移动依托能力中台打造粤港澳大湾区智能交通网络
- 加速"走出去" 前4个月汽车出口突破2000亿元_环球最资讯
- 全球焦点!邮储银行成功发行200亿元二级资本债券
- 当前关注:COOL LINK发布一季度业绩 股东应占溢利70.4万新加坡元同比扭亏为盈
- 当前观点:北汽蓝谷(600733):5月15日北向资金增持161.62万股
- 每日信息:中资银行备战“北向互换通”:捕捉境外交易机会 丰富工具箱
- 萨拉赫3妙传,3-0利物浦爆发,掀翻劲旅,豪取7连胜,曼联怕不怕|快播报
- 政府工程合同范本(热门4篇)-看点
- (体育)2023年“亚足联-中国足协草根足球日”主会场活动在京举办
- 对话腾讯集团高级副总裁马晓轶:潮水的方向
- Redmi Book 14 5月22日发布,重定义轻薄本
- steam修改个人资料_为什么steam打不开个人资料-环球速看
- 轮胎行业进入盈利修复窗口期,扩产能提速但仍面临成本压力考验_新视野
- 全球快播:抓举和挺举有何区别?前者要一气呵成,后者才是真正的实力
- 杀戮都市作者怒批瑟琴同人 弹射世界日服停更关服预定
- 环球资讯:肉鸽解谜《TASUKEMONO》上架steam 可爱角色大冒险
- 厦外刚刚公布!277人,录取!
- 碳酸根离子的大键怎么表示_碳酸根离子 全球微动态
- 多地呼吁避免520扎堆结婚登记:每年最高峰
- 【全球独家】沪渝蓉高铁秦家河大桥道岔连续梁双幅合龙
- 逆天改命?这些大学即将改名升级!怕是更难考了...
- 世界视点!不知道做什么工作怎么找工作_不知道做什么工作
- 5月15日午后两市板块龙虎榜排名(名单)_全球快看点
- 西甲综合 | 巴萨客胜西班牙人 提前四轮夺冠_每日观察
- 魏格纳环形山_关于魏格纳环形山简述
- 同福集团正定大健康产业园项目开工 总投资20亿元
- 战争与抉择单排英国怎么样_当前焦点
- 电视品牌满意度排名 电视品牌排行榜前十名2023
- 共青团12355青少年网络服务平台启动仪式在京举行
- 中信证券:本周迎来降息的重要窗口期
- 14秒!中国人自己的CPU+操作系统,实现一次飞跃-天天新动态
- 世界要闻:丹麦船东TORM一季度净利1.5亿美元
- 世界今热点:湖湘自然历丨复得返自然⑮天门山的背面,是怎样的光景
- 闫啸天本月底刑满释放 “大学生掏鸟案”回访 天天时讯
- 美国经济衰退概率升至40年新高,美联储距离降息不远了?
- 五险一金自己怎么办理
- 曼城下轮夺冠条件分析:阿森纳先赛,若输森林则曼城直接夺冠-热点
- 世界头条:星穹铁道抽卡模拟python程序
- 植物大战僵尸2电流醋栗怎么得(植物大战僵尸电流醋栗重合寒冰醋栗)
- 环球快播:你觉得76人VS凯尔特人的抢七大战 会是何种走向?
- 世界热点评!1分钟坚持9秒,气血通防中风!
- 世界速讯:宗城社区
- 焦点简讯:固定总价合同属于什么合同_固定总价合同定义
- 韩国介绍派团赴日考察核污水排海:不只听日方说 还会检查设备是否值得信赖|天天播资讯
- 2022宝宝dha十大品牌排行榜_宝宝dha哪个牌子好 世界快消息
- dnf武炼怎么打开_dnf武炼
- 系统教程篇:系统工具栏消失或操作没有反应时的解决方法
- 库明加:只要有耐心 很多事情都可能发生在你身上|每日精选
- 天天快播:年轻的战场原唱是谁唱的_年轻的战场原唱
- 上海的“小修小补”有了“集体户口” 今日热讯
- 全球热讯:“百褶裙”要退位了,今春流行的是“法式裙”,配对鞋子巨好看
- 动态焦点:釉里红的最大特点是_釉里红
- “晴歌”高唱,气温飙升!14日至15日局地最高气温可破30℃
- 售价24.58-34.58万元 全新林肯冒险家正式上市
- 金泰国际大厦邮编_金泰国际大厦_快播
- 焦点!虚拟现实技术发展趋势与应用前景_虚拟现实技术发展趋势
- 淄川区西河中心卫生院开展护士节系列活动
- 环球简讯:四大机遇与四项措施,挖掘中国-东盟金融合作新潜能
- 郭艾伦替补!辽宁首发:赵继伟、弗格、李晓旭、韩德君、张镇麟 全球热议
- 【全球报资讯】看哭了!这是真实版“万里归途”
- 环球要闻:江西多个景区推出文创雪糕 开启打卡新模式
- 你养我小我陪你老!37岁女子裸辞年薪50万工作回村照顾瘫痪奶奶:就算她生命只有3个月,那我可以陪她90天
- 常州钟楼“两湖”创新区重大项目集中签约 25个项目总投资100.5亿元
- 糖蒜怎么做好吃_糖蒜最正宗的做法
- 魔兽世界装备恢复超过90天_魔兽世界装备恢复
- 全球要闻:怎样订立遗嘱才是合法的
- 红魔 8 Pro+ 变形金刚领袖版,实在泰酷辣|世界即时
- 胸有成竹有关的人物_胸有成竹有关的人物文与可故事简述-最新快讯
- 台中捷运事故2天后,被指“提油救火”的公司代理董事长请辞
- 苹果手写键盘怎么设置_苹果手机手写怎么设置-环球热讯
- 当前观察:2023年05月13日05时30分新加坡元/人民币汇率最新报价
- 进球网:拜仁正关注奥尔莫,但将面临皇马、巴萨及马竞的竞争
- 天津市启动元宇宙创新职业技能大赛
- 博安生物(06955.HK):5月12日南向资金减持2800股|环球微头条
- 股票行情快报:襄阳轴承(000678)5月12日主力资金净卖出767.81万元
- 拒绝争番位,杨幂打了全体“事业粉”的脸?
- 一路对标顶级产品,奇遇XR为何仍不见起色?
- 三元催化清洗有什么用(三元催化清洗的作用) 全球要闻
- 世界快看点丨海信李炜:打造区域品牌需“头雁领航”更要“群雁齐飞”
- 贵州中心酿酒集团“醬鄉國”酒与你一起相约2023WAGC(中国)选拔赛
- 斯嘉丽约翰逊:同迪士尼官司很伤心!差点没演成黑寡妇-热讯
- lol礼物中心官网_lol礼物中心
- 2023武汉经济开发区幼儿园招生简章公告(持续更新中)
- 【播资讯】云南省今年一季度太阳能发电13.3亿千瓦时, 增长21.9%
- 吉锐科技创业板IPO,吃锂电行业红利营收两年翻44倍,8成收入依赖大客户毛利率大起大落_新视野
- 外汇局:2023年一季度我国经常账户顺差5605亿元
- 如何判断是平面轴承坏了还是承压轴承坏了?
- 高端装备中心中金村开展“关爱老年人”健康查体活动
- 上海北京杭州合肥,二手房交易量都大跌,发生了啥?|环球热闻
- 金汉斯自助餐厅电话多少_金汉斯自助餐厅 天天新视野
- 铁路天府站完成第一阶段施工,转入“地面”建设,预计2025年建成 每日看点
- 京东集团-SW(09618)发布一季度业绩 实现收入2430亿元 同比增加1.4%
- 租房合同不成立可以违约吗,一般租房合同都有违约金吗?
- 创新科普方式 提升防灾意识 环球速递
- NBA季后赛:生无可恋,杜兰特大发神威,太阳暴揍掘金
- 竹取物语 中文(竹取物语御伽草子)|每日速递
- 法大大李琳:“最强合规”背后的安全底座
X 关闭
行业规章
X 关闭