您当前的位置: 首页 > 
  • 0浏览

    0关注

    674博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

node学习

沙漠一只雕得儿得儿 发布时间:2022-02-08 21:04:33 ,浏览量:0

node模块系统

Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。

  • 导出模块
exports.world = function() {
  console.log('Hello World');
}
  • 导入模块
var hello = require('./hello');
hello.world();

在以上示例中,hello.js 通过 exports 对象把 world 作为模块的访问接口,在 main.js 中通过 require('./hello') 加载这个模块,然后就可以直接访 问 hello.js 中 exports 对象的成员函数了。

有时候我们只是想把一个对象封装到模块中,格式如下:

module.exports = function() {
  // ...
}

例如:

//hello.js 
function Hello() { 
    var name; 
    this.setName = function(thyName) { 
        name = thyName; 
    }; 
    this.sayHello = function() { 
        console.log('Hello ' + name); 
    }; 
}; 
module.exports = Hello;

这样就可以直接获得这个对象了:

//main.js 
var Hello = require('./hello'); 
hello = new Hello(); 
hello.setName('BYVoid'); 
hello.sayHello();

模块接口的唯一变化是使用 module.exports = Hello 代替了exports.world = function(){}。 在外部引用该模块时,其接口对象就是要输出的 Hello 对象本身,而不是原先的 exports。

==exports 和 module.exports 的使用==

如果要对外暴露属性或方法,就用 exports 就行,要暴露对象(类似class,包含了很多属性和方法),就用 module.exports。

Node.js 路由
                   url.parse(string).query
                                           |
           url.parse(string).pathname      |
                       |                   |
                       |                   |
                     ------ -------------------
http://localhost:8888/start?foo=bar&hello=world
                                ---       -----
                                 |          |
                                 |          |
              querystring.parse(queryString)["foo"]    |
                                            |
                         querystring.parse(queryString)["hello"]

当然我们也可以用 querystring 模块来解析 POST 请求体中的参数。

//parse 分析
//query 查询
var http = require("http");
var url = require("url");
 
function start() {
  function onRequest(request, response) {
    var pathname = url.parse(request.url).pathname;
    console.log("Request for " + pathname + " received.");
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello World");
    response.end();
  }
 
  http.createServer(onRequest).listen(8888);
  console.log("Server has started.");
}
 
exports.start = start;
Node.js 全局对象 __filename

__filename 表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。 如果在模块中,返回的值是模块文件的路径。

// 输出全局变量 __filename 的值
console.log( __filename );
$ node main.js
/web/com/runoob/nodejs/main.js
__dirname

__dirname 表示当前执行脚本所在的目录。

// 输出全局变量 __dirname 的值
console.log( __dirname );
$ node main.js
/web/com/runoob/nodejs
process Node.js 文件系统
var fs = require("fs")

Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。

异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。

建议大家使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。

读取例子
var fs = require("fs");

// 异步读取
fs.readFile('input.txt', function (err, data) {
   if (err) {
       return console.error(err);
   }
   console.log("异步读取: " + data.toString());
});

// 同步读取
var data = fs.readFileSync('input.txt');
console.log("同步读取: " + data.toString());

console.log("程序执行完毕。");
打开文件
var fs = require("fs");

// 异步打开文件
console.log("准备打开文件!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
  console.log("文件打开成功!");     
});
获取文件信息
var fs = require("fs");

console.log("准备打开文件!");
fs.stat('input.txt', function (err, stats) {
   if (err) {
       return console.error(err);
   }
   console.log(stats);
   console.log("读取文件信息成功!");
   
   // 检测文件类型
   console.log("是否为文件(isFile) ? " + stats.isFile());
   console.log("是否为目录(isDirectory) ? " + stats.isDirectory());    
});
写入文件
var fs = require("fs");

console.log("准备写入文件");
fs.writeFile('input.txt', '我是通 过fs.writeFile 写入文件的内容',  function(err) {
   if (err) {
       return console.error(err);
   }
   console.log("数据写入成功!");
   console.log("--------我是分割线-------------")
   console.log("读取写入的数据!");
   fs.readFile('input.txt', function (err, data) {
      if (err) {
         return console.error(err);
      }
      console.log("异步读取文件数据: " + data.toString());
   });
});
读取文件
var fs = require("fs");
var buf = new Buffer.alloc(1024);

console.log("准备打开已存在的文件!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
   console.log("文件打开成功!");
   console.log("准备读取文件:");
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
      if (err){
         console.log(err);
      }
      console.log(bytes + "  字节被读取");
      
      // 仅输出读取的字节
      if(bytes > 0){
         console.log(buf.slice(0, bytes).toString());
      }
   });
});
关闭文件
fs.close(fd, callback)
截取文件
fs.ftruncate(fd, len, callback)
删除文件
var fs = require("fs");

console.log("准备删除文件!");
fs.unlink('input.txt', function(err) {
   if (err) {
       return console.error(err);
   }
   console.log("文件删除成功!");
});
创建目录
var fs = require("fs");
// tmp 目录必须存在
console.log("创建目录 /tmp/test/");
fs.mkdir("/tmp/test/",function(err){
   if (err) {
       return console.error(err);
   }
   console.log("目录创建成功。");
});
读取目录
var fs = require("fs");

console.log("查看 /tmp 目录");
fs.readdir("/tmp/",function(err, files){
   if (err) {
       return console.error(err);
   }
   files.forEach( function (file){
       console.log( file );
   });
});
删除目录
var fs = require("fs");
// 执行前创建一个空的 /tmp/test 目录
console.log("准备删除目录 /tmp/test");
fs.rmdir("/tmp/test",function(err){
   if (err) {
       return console.error(err);
   }
   console.log("读取 /tmp 目录");
   fs.readdir("/tmp/",function(err, files){
      if (err) {
          return console.error(err);
      }
      files.forEach( function (file){
          console.log( file );
      });
   });
});
Node.js GET/POST请求 获取GET请求内容
var http = require('http');
var url = require('url');
var util = require('util');
 
http.createServer(function(req, res){
    res.writeHead(200, {'Content-Type': 'text/plain'});
 
    // 解析 url 参数
    var params = url.parse(req.url, true).query;
    res.write("网站名:" + params.name);
    res.write("\n");
    res.write("网站 URL:" + params.url);
    res.end();
 
}).listen(3000);
获取 POST 请求内容

POST 请求的内容全部的都在请求体中,http.ServerRequest 并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。

比如上传文件,而很多时候我们可能并不需要理会请求体的内容,恶意的POST请求会大大消耗服务器的资源,所以 node.js 默认是不会解析请求体的,当你需要的时候,需要手动来做。

var http = require('http');
var querystring = require('querystring');
 
var postHTML = 
  '菜鸟教程 Node.js 实例' +
  '' +
  '' +
  '网站名: 
' +
  '网站 URL: 
' +
  '' +
  '' +
  '';
 
http.createServer(function (req, res) {
  var body = "";
  req.on('data', function (chunk) {
    body += chunk;
  });
  req.on('end', function () {
    // 解析参数
    body = querystring.parse(body);
    // 设置响应头部信息及编码
    res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
    // 根据参数做你爱做的事
    if(body.name && body.url) { // 输出提交的数据
        res.write("网站名:" + body.name);
        res.write("
");
        res.write("网站 URL:" + body.url);
    } else {  // 输出表单
        res.write(postHTML);
    }
    res.end();
  });
}).listen(3000);
Node.js OS 模块

Node.js os 模块提供了一些基本的系统操作函数。我们可以通过以下方式引入该模块:

var os = require("os")

例子

var os = require("os");

// CPU 的字节序
console.log('endianness : ' + os.endianness());

// 操作系统名
console.log('type : ' + os.type());

// 操作系统名
console.log('platform : ' + os.platform());

// 系统内存总量
console.log('total memory : ' + os.totalmem() + " bytes.");

// 操作系统空闲内存量
console.log('free memory : ' + os.freemem() + " bytes.");
Node.js Path 模块

Node.js path 模块提供了一些用于处理文件路径的小工具,我们可以通过以下方式引入该模块:

var path = require("path")
var path = require("path");

// 格式化路径
console.log('normalization : ' + path.normalize('/test/test1//2slashes/1slash/tab/..'));

// 连接路径
console.log('joint path : ' + path.join('/test', 'test1', '2slashes/1slash', 'tab', '..'));

// 转换为绝对路径
console.log('resolve : ' + path.resolve('main.js'));

// 路径中文件的后缀名
console.log('ext name : ' + path.extname('main.js'));
Node.js Net 模块 Node.js DNS 模块
var dns = require("dns")
var dns = require('dns');

dns.lookup('www.github.com', function onLookup(err, address, family) {
   console.log('ip 地址:', address);
   dns.reverse(address, function (err, hostnames) {
   if (err) {
      console.log(err.stack);
   }

   console.log('反向解析 ' + address + ': ' + JSON.stringify(hostnames));
});  
});
Node.js Domain 模块

Node.js Domain(域) 简化异步代码的异常处理,可以捕捉处理try catch无法捕捉的异常。引入 Domain 模块 语法格式如下:

var EventEmitter = require("events").EventEmitter;
var domain = require("domain");

var emitter1 = new EventEmitter();

// 创建域
var domain1 = domain.create();

domain1.on('error', function(err){
   console.log("domain1 处理这个错误 ("+err.message+")");
});

// 显式绑定
domain1.add(emitter1);

emitter1.on('error',function(err){
   console.log("监听器处理此错误 ("+err.message+")");
});

emitter1.emit('error',new Error('通过监听器来处理'));

emitter1.removeAllListeners('error');

emitter1.emit('error',new Error('通过 domain1 处理'));

var domain2 = domain.create();

domain2.on('error', function(err){
   console.log("domain2 处理这个错误 ("+err.message+")");
});

// 隐式绑定
domain2.run(function(){
   var emitter2 = new EventEmitter();
   emitter2.emit('error',new Error('通过 domain2 处理'));   
});


domain1.remove(emitter1);
emitter1.emit('error', new Error('转换为异常,系统将崩溃!'));
Node.js Web 模块 Web 应用架构
  • Client - 客户端,一般指浏览器,浏览器可以通过 HTTP 协议向服务器请求数据。
  • Server - 服务端,一般指 Web 服务器,可以接收客户端请求,并向客户端发送响应数据。
  • Business - 业务层, 通过 Web 服务器处理应用程序,如与数据库交互,逻辑运算,调用外部程序等。
  • Data - 数据层,一般由数据库组成。
使用 Node 创建 Web 服务器
var http = require('http');
var fs = require('fs');
var url = require('url');
 
 
// 创建服务器
http.createServer( function (request, response) {  
   // 解析请求,包括文件名
   var pathname = url.parse(request.url).pathname;
   
   // 输出请求的文件名
   console.log("Request for " + pathname + " received.");
   
   // 从文件系统中读取请求的文件内容
   fs.readFile(pathname.substr(1), function (err, data) {
      if (err) {
         console.log(err);
         // HTTP 状态码: 404 : NOT FOUND
         // Content Type: text/html
         response.writeHead(404, {'Content-Type': 'text/html'});
      }else{             
         // HTTP 状态码: 200 : OK
         // Content Type: text/html
         response.writeHead(200, {'Content-Type': 'text/html'});    
         
         // 响应文件内容
         response.write(data.toString());        
      }
      //  发送响应数据
      response.end();
   });   
}).listen(8080);
 
// 控制台会输出以下信息
console.log('Server running at http://127.0.0.1:8080/');
使用 Node 创建 Web 客户端
var http = require('http');
 
// 用于请求的选项
var options = {
   host: 'localhost',
   port: '8080',
   path: '/index.html'  
};
 
// 处理响应的回调函数
var callback = function(response){
   // 不断更新数据
   var body = '';
   response.on('data', function(data) {
      body += data;
   });
   
   response.on('end', function() {
      // 数据接收完成
      console.log(body);
   });
}
// 向服务端发送请求
var req = http.request(options, callback);
req.end();
Node.js Express 框架 Express 简介
  • 可以设置中间件来响应 HTTP 请求。
  • 定义了路由表用于执行不同的 HTTP 请求动作。
  • 可以通过向模板传递参数来动态渲染 HTML 页面。
安装 Express
$ cnpm install express --save

以下几个重要的模块是需要与 express 框架一起安装的:

  • body-parser - node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。
  • cookie-parser - 这就是一个解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。
  • multer - node.js 中间件,用于处理 enctype="multipart/form-data"(设置表单的MIME编码)的表单数据。

安装完后,我们可以查看下 express 使用的版本号:

$ cnpm list express
/data/www/node
└── express@4.15.2  -> /Users/tianqixin/www/node/node_modules/.4.15.2@express
第一个 Express 框架实例
//express_demo.js 文件
var express = require('express');
var app = express();
 
app.get('/', function (req, res) {
   res.send('Hello World');
})
 
var server = app.listen(8081, function () {
 
  var host = server.address().address
  var port = server.address().port
 
  console.log("应用实例,访问地址为 http://%s:%s", host, port)
 
})
请求和响应
app.get('/', function (req, res) {
   // --
})

Request 对象 - request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性。常见属性有:

  • req.app:当callback为外部文件时,用req.app访问express的实例
  • req.baseUrl:获取路由当前安装的URL路径
  • req.body / req.cookies:获得「请求主体」/ Cookies
  • req.fresh / req.stale:判断请求是否还「新鲜」
  • req.hostname / req.ip:获取主机名和IP地址
  • req.originalUrl:获取原始请求URL
  • req.params:获取路由的parameters
  • req.path:获取请求路径
  • req.protocol:获取协议类型
  • req.query:获取URL的查询参数串
  • req.route:获取当前匹配的路由
  • req.subdomains:获取子域名
  • req.accepts():检查可接受的请求的文档类型
  • req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages:返回指定字符集的第一个可接受字符编码
  • req.get():获取指定的HTTP请求头
  • req.is():判断请求头Content-Type的MIME类型

Response 对象 - response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据。常见属性有:

  • res.app:同req.app一样
  • res.append():追加指定HTTP头
  • res.set()在res.append()后将重置之前设置的头
  • res.cookie(name,value [,option]):设置Cookie
  • opition: domain / expires / httpOnly / maxAge / path / secure / signed
  • res.clearCookie():清除Cookie
  • res.download():传送指定路径的文件
  • res.get():返回指定的HTTP头
  • res.json():传送JSON响应
  • res.jsonp():传送JSONP响应
  • res.location():只设置响应的Location HTTP头,不设置状态码或者close response
  • res.redirect():设置响应的Location HTTP头,并且设置状态码302
  • res.render(view,[locals],callback):渲染一个view,同时向callback传递渲染后的字符串,如果在渲染过程中有错误发生next(err)将会被自动调用。callback将会被传入一个可能发生的错误以及渲染后的页面,这样就不会自动输出了。
  • res.send():传送HTTP响应
  • res.sendFile(path [,options] [,fn]):传送指定路径的文件 -会自动根据文件extension设定Content-Type
  • res.set():设置HTTP头,传入object可以一次设置多个头
  • res.status():设置HTTP状态码
  • res.type():设置Content-Type的MIME类型
路由
var express = require('express');
var app = express();

//  POST 请求
app.post('/', function (req, res) {
   console.log("主页 POST 请求");
   res.send('Hello POST');
})
 
//  /del_user 页面响应
app.get('/del_user', function (req, res) {
   console.log("/del_user 响应 DELETE 请求");
   res.send('删除页面');
})
静态文件

Express 提供了内置的中间件 express.static 来设置静态文件如:图片, CSS, JavaScript 等。

app.use('/public', express.static('public'));
var express = require('express');
var app = express();
 
app.use('/public', express.static('public'));
 
app.get('/', function (req, res) {
   res.send('Hello World');
})
 
var server = app.listen(8081, function () {
 
  var host = server.address().address
  var port = server.address().port
 
  console.log("应用实例,访问地址为 http://%s:%s", host, port)
 
})
GET 方法

index.htm 文件代码:




First Name:   

 
Last Name: 




server.js 文件代码:

var express = require('express');
var app = express();
 
app.use('/public', express.static('public'));
 
app.get('/index.htm', function (req, res) {
   res.sendFile( __dirname + "/" + "index.htm" );
})
 
app.get('/process_get', function (req, res) {
 
   // 输出 JSON 格式
   var response = {
       "first_name":req.query.first_name,
       "last_name":req.query.last_name
   };
   console.log(response);
   res.end(JSON.stringify(response));
})
 
var server = app.listen(8081, function () {
 
  var host = server.address().address
  var port = server.address().port
 
  console.log("应用实例,访问地址为 http://%s:%s", host, port)
 
})
POST 方法
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
 
// 创建 application/x-www-form-urlencoded 编码解析
var urlencodedParser = bodyParser.urlencoded({ extended: false })
 
app.use('/public', express.static('public'));
 
app.get('/index.htm', function (req, res) {
   res.sendFile( __dirname + "/" + "index.htm" );
})
 
app.post('/process_post', urlencodedParser, function (req, res) {
 
   // 输出 JSON 格式
   var response = {
       "first_name":req.body.first_name,
       "last_name":req.body.last_name
   };
   console.log(response);
   res.end(JSON.stringify(response));
})
 
var server = app.listen(8081, function () {
 
  var host = server.address().address
  var port = server.address().port
 
  console.log("应用实例,访问地址为 http://%s:%s", host, port)
 
})
文件上传

index.htm 文件代码:


    
        文件上传表单
    

    文件上传:
    选择一个文件上传: 
    
        
        
        
    


var express = require('express');
var app = express();
var fs = require("fs");
 
var bodyParser = require('body-parser');
var multer  = require('multer');
 
app.use('/public', express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(multer({ dest: '/tmp/'}).array('image'));
 
app.get('/index.htm', function (req, res) {
   res.sendFile( __dirname + "/" + "index.htm" );
})
 
app.post('/file_upload', function (req, res) {
 
   console.log(req.files[0]);  // 上传的文件信息
 
   var des_file = __dirname + "/" + req.files[0].originalname;
   fs.readFile( req.files[0].path, function (err, data) {
        fs.writeFile(des_file, data, function (err) {
         if( err ){
              console.log( err );
         }else{
               response = {
                   message:'File uploaded successfully', 
                   filename:req.files[0].originalname
              };
          }
          console.log( response );
          res.end( JSON.stringify( response ) );
       });
   });
})
 
var server = app.listen(8081, function () {
 
  var host = server.address().address
  var port = server.address().port
 
  console.log("应用实例,访问地址为 http://%s:%s", host, port)
 
})
Cookie 管理

我们可以使用中间件向 Node.js 服务器发送 cookie 信息,以下代码输出了客户端发送的 cookie 信息:

// express_cookie.js 文件
var express      = require('express')
var cookieParser = require('cookie-parser')
var util = require('util');
 
var app = express()
app.use(cookieParser())
 
app.get('/', function(req, res) {
    console.log("Cookies: " + util.inspect(req.cookies));
})
 
app.listen(8081)
什么是Buffer(16进制)
  • 缓冲区Buffer是暂时存放在 输入输出数据的一段内存
  • JS语言没有二进制数据类型,而在处理TCP和文件流的时候,必须要处理二进制数据
  • NodeJS提供了一个BUffer对象来提供对二进制数据的操作
  • 是一个表示固定内存分配的全局对象,也就是说要放到缓冲区中的字节数需要提前确定
  • Buffer好比由一个多位字节元素组成的数组,可以有效的在JavaScript中表示二进制数据
什么是字节
  • 字节(Byte)是计算机存储时的一种计量单位,一个字节等于8位二进制数
  • 一个位就代表一个0或1,每8个(bit)组成一个字节(Byte)
  • 字节是通过网络传输信息的单位
  • 一个字节最大值十进制数是255
  • 一个字节转化成16进制是ff

1024b=1k

8bit(8个二进制) = 1b

一个汉字(3b)

let sum = 0;
for (var i = 1; iprev+next.length,0)
    }
    
    // 2.通过长度创建一个这么打buffer Buffer.alloc(len)
    let buffer = Buffer.alloc(totalLength);
    
    // 3.在啊循环list将每一项拷贝到这个大buffer上 buf.copy
    let offset = 0;
    list.forEach((buff)=>{
        if(Buffer.isBuffer(buff)) return {throw new Error('not buffer')}
        buff.copy(buffer, offset);
        offset += buff.length;
     })
    
    // 4.如果长度过长fill或者采用slice截取有效长度

    
    // 5.返回一个新buffer
    return buffer.slice(0, offset)
}
  • Buffer.isBuffer 判断当前是不是buffer类型
进制转化
//base64 MD5
// 10-> 16,2 8
//16.2.8 -> 10;
let buf = Buffer.from('珠');
// 把一个汉字的24位转换成4个字节,每个字节6位,不足的补0
console.log(buf.toString('base64'));

// 1.把16进制转换成2进制toString()
console.log((0xef).toString(2));

// 2.将这些值转换成10进制,去可见编码中取值parseInt
parseInt('00111001', 2);
promise&await
//fileSystem文件系统
let fs = require('fs');
// 既有同步又有异步,异步由callback

// 同步的读取
// 1.读取文件 文件必须存在,不能通过/读取内容,/表示根目录
// 2.读取的默认类型就是buffer
let result = fs.readFileSync('./3.fs.js', 'utf8');

// 第一次的输出是下一次的输入
let content1 = fs.readFileSync('./1.txt', 'utf8');
let content2 = fs.readFileSync(content1, 'utf8');

fs.readFile('./1.txt', 'utf8', function(err, data){
    if(err)return console.log(err);
    // 回调地狱
})
let fs = require('fs');
// promise resolve成功 reject失败
let util = require('util');
let read = util.promisify(fs.readFile);
read('./1.txt').then(function(data){
    console.log(data);
    return read(data, 'utf8');// 如果第一个promise中返回了一个promise实例,会把当前的执行结果传到下一个then中
}).then(function(data){
    console.log(data);// 如果你返回的不是promise 会把结果继续向下传递
}).catch(()=>{
    // 处理错误,如果写了错误callback走自己的,如果没写走catch
})
// 流程控制

// await后面智能跟随promise 终极方案
async function result(){
    let content1 = await read('./1.txt', 'utf8');
    let content2 = await read(data,'utf8');
    let str = content2+'xxx';
    console.log(str);
}
result();


// 自己封装promise
functioon read(){
    return new Promise((resolve,reject)=>{
        fs.readFile(url,'utf8', function(err,data) {
            if(err) return reject(err);
            resolve(data);
        })
    })
};

read('./1.txt').then(function(data){
    console.log(data);
},function(err){
    console.log(err);
})

将俩个异步请求在同一时刻拿到结果合并

let fs = require('fs');
let {promisify} = require('util');
let read = promisify(fs.readFile);

let school = {};
read('x.txt','uft8').then(data=>{
    school.name  = data;
    out();
},err=>{
    
});
read('y.txt','uft8').then(data=>{
    school.age  = data;
    out();
},err=>{
    
});

function out(){
    if(school.name && school.age)console.log(school)
}

all

let fs = require('fs');
let {promisify} = require('util');
let read = promisify(fs.readFile);

let school = {};
read('x.txt','uft8').then(data=>{
    
},err=>{
    
});
read('y.txt','uft8').then(data=>{
    
},err=>{
    
});
// 调用all方法后会返回一个新的promise实例
Promise.all([read('x.txt', utf8), read('y.txt', uft8)]).then(function(data){
    // data是一个数组的类型,对应的是和前面请求的顺序相同(会把成功后的结果放入数组中),假如说一个失败了,走错误
    console.log(data);
}).catch(err=>{
    
})

async function result(){
    let [name, age] = await Promise.all(([read('x.txt', utf8), read('y.txt', uft8)]);
    console.log(name, age);
}

promise解决的问题
  • 回调地狱
  • 同步异步的返回结果
  • async await简化promise写法(语法糖)
Promise.race

谁快以谁为准

let fs = require('fs');
let {promisify} = require('util');
let read = promisify(fs.readFile);

Promise.all([read('x.txt', utf8), read('y.txt', uft8)]).then(function(data){
    console.log(data);
}).catch(err=>{
    
})
Promise.resole

包装成promise对象

Promise.resolve('123').then(function(data){
    console.log(data);
})
Promise.reject
Promise.resolve('123').then(function(data){
    console.log(data);
}).cacth(err=>{
    console.log(data);
})
writeFile

如果程序只执行一次,可以同步。readFile会把内容读到内存中,用这种方式会导致淹没可用内存

同步的返回结果一般用return 异步的返回结果一般用回调函数

let fs = require('fs');
// 读取都是buffer类型,写入的时候用的是都utf8格式
// 读取的文件必须存在,写的时候文件不存在会自动创建。里面有内容会被覆盖
//  自动调用toString方法,第二个参数支持字符串、buffer
fs.writeFile('1.txt', Buffer.from('飞哥大英雄'),function(err){
    if(err) return err
}); 

// 同步
fs.writeFileSync('1.txt',"{name: '乔碧萝殿下', age:58}")
copy方法封装
let fs = require('fs');
// 同步
function copySync(source, target){ // 带sync是同步readFileSync+writeFileSync
    let result = fs.writeFileSync(source);// 可以不写utf8
    fs.writeFileSync(target, result);
}
copySync('1.txt', '2.txt')

// 异步
function copy(source, target, callback){ // readFile  writeFile
    fs.readFile(source, function(err, data){
        if(err) return callback(err);
        fs.writeFile(target, data, callback)
    })
}
copySync('1.txt', '2.txt', function(err,date){
    
})

关注
打赏
1657159701
查看更多评论
立即登录/注册

微信扫码登录

0.0410s