批改状态:合格
老师批语:
node.js中cps风格
重点讲到的是回调,回调可以无限极回调,将前几位参数值的结果,传给最后一个函数,其中回调的最后一个参数,是一个函数,函数回调
其中异步中,是将函数的回调部分,增加了一个定时器进行操作,让当前的返回给函数的值,扔到次线程
回调参数一定是在末尾
以及错误优先
直接上代码部分:
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>csp工作原理</title></head><body><script>//node中低层设计模式:回调与异步//传统模式function add1(a, b) {// return是直接返回给调用者return a + b;}console.log(add1(1, 3));console.log("------------");// Cps风格// callback,必须是参数列中的最后一位参数function add2(a, b, callback) {// 结果直接返回给回调 回调给第三位参数//也就是a+b的结果并不直接返回调用者,而是传给了另外一个回调函数执行,在这个函数中,感觉是一个参数值callback(a + b);}console.log("--------cps同步执行---------");//但是在输出结果的时候,是一个函数,函数输出的部分,就是函数自己本身add2(1, 2, call => console.log(call));console.log("---------cps同步执行结束----------");///////////cps异步风格,我感觉就是把输出的函数,放到了定时器中执行了,然后就是异步了/////function add3(a, b, callback) {setTimeout(() => {// 异步风格是将回调部分,在回调时,转为了异步callback(a + b);}, 300);}console.log("------异步风格----------");//异步不在主线程执行add3(1, 2, ad => console.log(ad));console.log("------异步风格结束-------");// 异步: 代码书写顺序与执行顺序不一致, 乱序执行// Node中几乎每个API都使用了CPS异步风格来执行,遵循2个约定// 1. 回调结尾: 回调参数始终是函数的最后一个参数// 2. 错误优先: 回调传参时, 错误永远是第一个参数</script></body></html>
示例截图:
模块的导出使用代码module.exports/exports
模块的导入由代码require 导入
核心模块
核心模块其中2类:http模块 web模块fs文件模块
// node模块//node模块风格-commonjs//node模块跟js模块类似一样,node风格就是commonjs 他的内部成员全部私有,只有导出才可以被访问使用// node模块三大类//1.核心模块,开箱即用//2.文件模块,自己写,并且要导入//3.第三方模块,需要自己导入使用/////////核心模块//////////无需声明直接使用///const http = require("http");console.log(http);///显示所有的http模块内可以使用的apiconst fs = require("fs");console.log(fs);// fs模块是调佣文件的模块,比如可以复制,剪切对文件的操作,下面也是内置的一些api
示例截图:

模块的导出使用代码module.exports/exports
模块的导入由代码require 导入
// node模块//node模块风格-commonjs//node模块跟js模块类似一样,node风格就是commonjs 他的内部成员全部私有,只有导出才可以被访问使用// node模块三大类//1.核心模块,开箱即用//2.文件模块,自己写,并且要导入//3.第三方模块,需要自己导入使用/////////核心模块//////////无需声明直接使用///const http = require("http");console.log(http);///显示所有的http模块内可以使用的apiconst fs = require("fs");console.log(fs);// fs模块是调佣文件的模块,比如可以复制,剪切对文件的操作,下面也是内置的一些api///////文件模块//////////需要声明再导入才能使用/////// 导入刚刚写的文件模块// 这里需要使用require导入模块let site = require("./m1.js");console.log(site);//访问模块内的方法及参数console.log(site.getname());//////使用module.exports导入//////site = require("./m2.js");console.log(site);// 根据m1.js跟m2.js中看的出,exports可以导出多个,而module.exports可以导出多个
//文件模块,也就是自定义模块//使用 exports:导出多个//1:逐个导出// exports为简写exports.niuniu = 1;exports.niu = function (a, b) {return a + b;};exports.name = "php.中文网";exports.domain = "www.php.cn";exports.getname = function () {///与其他的name domain a niuniu等为上线文关系,看不明白就把上面的内容放到{}对象里面,秒懂return ` ${this.name}网址为:${this.domain}`;};//如何使用文件模块呢? 需要导入一下,先导入到同目录下的dom1node模块.js文件里面吧/////////上面为单个导出////////////////////统一导出示例////////////// 先声明几个// exports导出风格let name = "php.中文网";let domain = "www.php.cn";let getname = function () {///与其他的name domain a niuniu等为上线文关系,看不明白就把上面的内容放到{}对象里面,秒懂return ` ${this.name}网址为:${this.domain}`;};exports.name = name;exports.domain = domain;exports.getname = getname;// 写完之后到控制台输出,发现还是一样的结果
// 导出模块成员 module.exports// module.exports 属于完整语法 exports是完整语法的简化let name = "php.中文网";let domain = "www.php.cn";let getname = function () {///与其他的name domain a niuniu等为上线文关系,看不明白就把上面的内容放到{}对象里面,秒懂return ` ${this.name}网址为:${this.domain}`;};module.exports.name = name;module.exports.domain = domain;module.exports.getname = getname;//////第一步简写方法///// module.exports = { name: name, domain: domain, getname: getname };// 当上面的满足条件时,还可以简写module.exports = { name, domain, getname };//进一步简化,放入对象中打包处理module.exports = {name = "php.中文网",domain = "www.php.cn",getname() {///与其他的name domain a niuniu等为上线文关系,看不明白就把上面的内容放到{}对象里面,秒懂return ` ${this.name}网址为:${this.domain}`,};
////////////////////////////////////////////////////////////////////
本案例使用node.js插件node-snippets来实现的代码块
代码示例:
//http模块const http = require("http");//导入http模块http// .createServer(function (request, response) {// response.writeHead(200, { "Content-Type": "text/html" });// response.end("<h2> Hello World</h2>");// 下面改为json格式.createServer(function (request, response) {response.writeHead(200, { "Content-Type": "application/json" });response.end(`{"name":"php中文网","id":1232,"qqemail":"12344567@qq.com"}`);}).listen(8081);// 这里可以简化处理// 直接使用.liston(8081,()=>console.log("Server running at http://127.0.0.1:8081/"))console.log("Server running at http://127.0.0.1:8081/");// 默认输出的是文本模式,当输出html格式时,把"text/plain"文档类型这里改为"text/html" 立马渲染到了html页面// 返回html更改为"text/html"// 返回json更改为"application/json"
示例截图:
文件模块示例代码:本案例使用node.js插件node-snippets来实现的代码块__dirname读取目录
//文件模块// node-file-read-async 异步读取// node-file-read-sync 同步读取console.log(__dirname); //读取当前项目地址// var fs = require("fs");fs.readFile(__dirname + "/niuniu.txt", function (err, data) {if (err) return console.error(err);console.log(data.toString());});
示例截图:
| 参数 | 示例 | 说明 |
|---|---|---|
| resolve | path.resolve(str) | 拿到绝对路径 |
| dirname | path.dirname(str) | 拿到目录 |
| basename | path.basename(str) | 拿到文件名 |
| extname | path.extname(str) | 拿到扩展名 |
| parse | path.parse(str) | 路径转obj对象 |
| format | path.format(obj) | 对象转obj |
| 下面有具体的代码示例,可以比对截图查看 |
代码部分:
// path模块 解析路径const str = "./node/hello.js";// 拿到模块数据 赋值一个变量const path = require("path");// 拿到绝对路径console.log(path.resolve(str));//目录部分//只拿到目录console.log(path.dirname(str));//查看文件名console.log(path.basename(str));//扩展名console.log(path.extname(str));//路径转成对象 pathstr转成 obj对象console.log(path.parse(str));//对象转成路径 obj对象转成pathstrconst obj = {root: "",dir: "./node",base: "hello.js",ext: ".js",name: "hello",};console.log(path.format(obj));
示例截图:
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号