工作中对于一些老项目,有 callback 的通常也会使用 util.promisify 进行转换,之前更多是知其然不知其所以然,本文会从基本使用和对源码的理解实现一个类似的函数功能。 1....创建一个 text.txt 文件 创建一个 text.txt 文件,写入一些自定义内容,下面的 Demo 中我们会使用 fs.readFile 来读取这个文件进行测试。...2.1 util.promisify.custom 基本使用 在 fs.readFile 上定义 util.promisify.custom 符号,其功能为禁止读取文件。...3.1 util.promisify 中的基本使用 和上面区别的地方在于 .then 接收到的是一个对象 { address, family } 先明白它的基本使用,下面会展开具体是怎么实现的 const...也意味着只有 Nodejs 模块中例如 dns.klookup()、fs.read() 等方法在多参数的时候可以使用 util.promisify 转为 Promise,如果我们自定义的 callback
Node.js还不支持Decorator,可以使用Babel进行转换,也可以在TypeScript中使用Decorator。... type: string; } @Required 是一个属性装饰器,使用时添加到属性声明前,作用是在 target 的自定义属性metadata中添加对应属性的必填规则。...访问符装饰器 访问符装饰器的使用与方法装饰器一致,参数和返回值相同,只是访问符装饰器用在访问符声明之前。需要注意的是,TypeScript不允许同时装饰一个成员的get和set访问符。...) method() { } } 3. design类型元数据 要使用design类型元数据需要在tsconfig.json中设置emitDecoratorMetadata为true,如下所示...,通过给Controller层的类和方法添加装饰器来定义路由信息,当创建路由时扫描指定目录下所有Controller,获取装饰器定义的路由信息,从而实现自动添加路由。
8、Buffer(缓冲区) JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。 但在处理像TCP流或文件流时,必须使用到二进制数据。...end - 没有更多的数据可读时触发。 error - 在接收和写入过程中发生错误时触发。 finish - 所有数据已被写入到底层系统时触发。...通常我们用于从一个流中获取数据并将数据传递到另外一个流中。 以下实例我们通过读取一个文件内容并将内容写入到另外一个文件中。...# cd fs 15.1 异步和同步 Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync...(stdout & stderr),在进程返回大量数据时使用。
fs.readFile 读取文件(异步)。 fs.readFileSync 读取文件(同步)。 fs.readdir 读取目录。 fs.rename 重命名。 fs.rmdir 删除目录。...stats.isFIFO() 如果是FIFO,返回true,否则返回 false,FIFO是UNIX中的一种特殊类型的命令管道。...执行 node fs.js。 会发现目录下多了一个 index.js 文件夹,并且添加了“hello NodeJS!”的内容。...注意,这样的写入,是清空原文件中的所有数据,然后添加“hello NodeJS!”这句话,即:存在即覆盖,不存在即创建。...打开 index.js 文件,发现里面内容变成了“存入数据…”。 打印结果: 写入完成! 复制代码 以上我们就通过流的形式进行了读取和写入的操作。
而 script 标签太多会导致文件之间依赖关系混乱,全局变量太多也会导致数据流相当紊乱,命名冲突和内存泄漏也会更加频繁的出现。...在 Nodejs 源码 中,我们可以看到当解析不到文件名的时候,会尝试使用 tryExtensions 方法来添加扩展名:if (!..._extensions 对象上,前文有提到过:.js 文件:通过同步读取文件内容后编译执行.json 文件:通过 fs 模块读取文件,之后使用 JSON.parse 转化成 JS 对象.node 文件:...Nodejs 引入模块的加载顺序和基本步骤 1、加载顺序和速度: require 函数接收到模块标识符时,会优先检查内存中是否已经有缓存的模块对象,有的话直接返回,没有就继续查找。...然后就是文件模块,Nodejs 通过找到文件然后使用对应的方法加载文件中的代码并执行。最后才是自定义模块。 2、加载基本步骤: 加载步骤大概有路径分析、文件定位和编译执行三个过程。
案例2:没有DOM和BOM 在 Node 中,采用 EcmaScript 进行编码 没有 BOM、DOM 和浏览器中的 JavaScript 不一样 console.log(window) console.log...在 Node 中如果想要进行文件操作,就必须引入 fs 这个核心模块 在 fs 这个核心模块中,就提供了所有的文件操作相关的 API 例如:fs.readFile 就是用来读取文件的 使用 require...null 失败 data undefined没有数据 error 错误对象 error 如果读取失败,error就是错误对象 如果读取成功,error就是null data 如果读取成功.../data/hello.txt', function (error, data) { console.log(data) }) 在新建的 hello.txt 文件中写入 hello nodejs 你好... 文件中存储的其实都是二进制数据 0 1 这里为什么看到的不是 0 和 1 呢?
Node 自带了交互式解释器,可以执行以下任务: 读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中。...2 * 3 ) - 4 3 > 使用变量 你可以将数据存储在变量中,并在你需要的时候使用它。...停止 REPL 按下两次 ctrl + c 键就能退出 REPL: NPM 使用介绍 NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:...目录中,因此在代码中只需要通过 require(‘express’) 的方式就好,无需指定第三方包路径。...例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。
但是,BOM 字符虽然起到了标记文件编码的作用,其本身却不属于文件内容的一部分,如果读取文本文件时不去掉 BOM,在某些使用场景下就会有问题。...例如把几个 JS 文件合并成一个文件后,如果文件中间含有 BOM 字符,就会导致浏览器 JS 语法错误。因此,使用 NodeJS 读取文本文件时,一般需要去掉 BOM。...支持在读取文本文件时,或者在 Buffer 转换为字符串时指定文本编码,但 GBK 编码不在 NodeJS 自身支持范围内。...输出响应 可以看到,第一版代码依次把请求的文件读取到内存中之后,再合并数据和输出响应。...并且在读取文件时,使用了只读数据流来简化代码。 第三次迭代 从工程角度上讲,没有绝对可靠的系统。即使代码没有 BUG,也可能因为操作系统,甚至是硬件导致服务器程序在某一天挂掉。
什么是GridFS GridFS 是MongoDB 的一个子模块,使用 GridFS 可以基于 MongoDB 来持久存储文件,并且支持分布式应用(文件分布存储和读取)。...当你想访问大型文件的部分信息,却不想加载整个文件到内存时,您可以使用GridFS 存储文件,并读取文件部分信息,而不需要加载整个文件到内存。...当你想让你的文件和元数据自动同步并部署在多个系统和设施,你可以使用GridFS 实现分布式文件存储。...最后根据“n”字段顺序读取 chunk 的“data”字段数据,还原文件。 存储过程如图下所示: fs.files 集合存储文件的元数据,以类 json 格式文档形式存储。...MIME类型 "metadata": // 文件自定义信息 } fs.chunks 集合存储文件文件内容的二进制数据,以类 json 格式文档形式存储。
Node.js中实现了基于轮询的文件监听机制,基于轮询的监听其实效率是很低的,因为需要我们不断去轮询文件的元数据,如果文件大部分时间里都没有变化,那就会白白浪费CPU。...3 read(inotify实例对应的文件描述符, &buf, sizeof(buf)),如果没有事件触发,则阻塞(除非设置了非阻塞)。否则返回待读取的数据长度。buf就是保存了触发事件的信息。...Libuv在inotify机制的基础上做了一层封装。我们看一下inotify在Libuv的架构图如图所示。 ? 我们再来看一下Libuv中的实现。我们从一个使用例子开始。 1....并且往Libuv插入一个观察者io,Libuv会在Poll IO阶段注册到epoll中。 2 往操作系统注册一个待监听的文件。返回一个id。 3 Libuv判断该id是不是在自己维护的红黑树中。...不在红黑树中,则插入红黑树。返回一个红黑树中对应的节点。把本次请求的信息封装到handle中(回调时需要)。然后把handle插入刚才返回的节点的队列中。这时候注册过程就完成了。
第2章 核心模块的使用 2.1.1 FS模块 node核心模块之一,用于操作文件; 中文手册 : http://nodejs.cn/api/fs.html 文件读写 // 引入模块 var fs = require...cb,cb2){ // 回调函数 (写入成功后执行的函数) console.log(cb); console.log(cb2); }) // 从文件中读取内容 fs.readFile...因为我们的服务器接受请求处理并响应数据时,并没有指定响应数据的类型,所以出现了乱码; 而在http中,我们可以通过服务器的响应头指定数据类型,在 http.ServerResponse 类 中为我们提供了...但是,我们不能一直将html代码写到服务器的方法中,而是需要建一个xx.html的文件,将html文件中的内容返回给客户端; 2.2.2 .html : <!...].mtime = st.mtime; file_obj[i].size = st.size; // 当读取的文件个数与所有文件个数相等时
Stream(数据流) 官方文档: http://nodejs.org/api/stream.html 当内存中无法一次装下需要处理的数据时,或者一边读取一边处理更加高效时,我们就需要用到数据流。...但是,BOM字符虽然起到了标记文件编码的作用,其本身却不属于文件内容的一部分,如果读取文本文件时不去掉BOM,在某些使用场景下就会有问题。...支持在读取文本文件时,或者在Buffer转换为字符串时指定文本编码,但遗憾的是,GBK编码不在NodeJS自身支持范围内。...输出响应 可以看到,第一版代码依次把请求的文件读取到内存中之后,再合并数据和输出响应。...并且,在读取文件时,第二版代码直接使用了只读数据流来简化代码。 第三次迭代 第二次迭代之后,服务器本身的功能和性能已经得到了初步满足。
; }) 上面的例子中,通过使用node自带的http模块,调用其http.creatServer方法在本机上开启了一个http服务,监听了本地的8000端口,代码逻辑很简单,当接收到一个req请求时,...; }) 上例子中,先确定了一个数据模型data,内部一共有三个字段。这里的数据模型就是前端开发前与后端所定义的返回格式,最终前端要拿到这个JSON格式的数据在客户端进行处理。...但是上面例子中的接口和我们常用的接口有一个差异点,就是接口名称和返回内容均不规范,使用者直接通过没有路径的http://127.0.0.1:8000来使用接口,这跟我们日常使用的接口是完全不一样的,那我们接下来再看一下如何给提供一个规范化的接口呢...实例中的源码简单解析一下,当服务接收到请求时,先判断请求的api名称是不是事先约定好的/api/search/data,判断通过后,将前端传递在链接上的参数userId获取到,处理后插入到返回的json...而在Nodejs中,本身便提供了fs文件操作模块,这个模块模块底层并不是JavaScript来编写的,是具备操作文件的C++语言编写的,其封装完成后将上层暴露给Nodejs,然后便可以使用JavaScript
从流读取数据的方式有很多种。 可写流(比如例子中的 res)会暴露了一些方法,比如 write() 和 end() 用于写入数据到流。...你可以用 readline 模块来读取 stdin,可以用来逐行读取文件流,也可用它来在控制台和用户进行一些交互。...解码查询字符串中的参数 querystring.unescape 方法是和 querystring.escape 相逆的方法,在使用 querystring.parse 方法时可能会用到。...在 Node.js 中,文件和模块是一一对应的关系,可以理解为一个文件就是一个模块。.../INDEX')会返回两个不同的对象,无论'./index'和'./INDEX'是否是同一个文件。 5. 循环依赖 当 require()存在循环调用时,模块在返回时可能并不会被执行。
/meta/packages' // 读取整个 VueUse 的元数据 export async function readMetadata() { // indexes 包括 packages、...meta/packages 读取元数据,生成 indexes 结果并写入 index.json 文件,打开 index.json 瞄一眼: { "packages": { "shared":...当入口点不是 CommonJS 模块时,则 require.main 为 undefined,且主模块不可达。...在插件部分,iife 输出格式上使用了 esbuild[9] 的 minify [10] 配置,对于指定 target 的构建需求上,使用了 esbuild 的 target[11] 配置。...beta 字段,就在发布参数上打上 tag,可以在终端执行 npm info @vueuse/core 查看 beta 包: 最后循环包数据 packages 依次执行 npm publish --
服务端是不用管的,已经配置ok 客户端需要把解压后的frp文件夹,让用户能随心修改。(不能说每个用户使用此软件时,都需要在本地下载一个frp压缩包) 能够在软件里启动子进程。 ./frpc -c ....实现方法 需要读写frp/frpc.ini文件里的内容 用到nodejs里的ini, fs, path模块。 需要启动frp 用nodejs里 child_process 模块。...(__dirname, '../../') let filePath = path.join(appPath, 'frp', 'frpc.ini') let config = null // 开始读取数据...= config } }) 点击"连接"时, 能够修改frpc.ini // 写入数据 function writeConfig(config) { var iniObj = { common...(filePath, iniStr) } 可以读取写入frpc.ini之后, 就要建立连接了 nodejs里的子进程模块 http://nodejs.cn/api/child_process.html
nodejs中如何使用文件流读写文件 在nodejs中,可以使用fs模块的readFile方法、readFileSync方法、read方法和readSync方法读取一个文件的内容,还可以使用fs模块的writeFile...在使用read、readSync读文件时,nodejs将不断地将文件中一小块内容读入缓存区,最后从该缓存区中读取文件内容。...使用rite、writeSync写文件时,nodejs执行如下过程:1、将需要书写的数据写到一个内存缓冲区;2、待缓冲区写满之后再将该缓冲区内容写入文件中;3、重复执行过程1和过程2,直到数据全部写入文件为止...但在很多时候,并不关心整个文件的内容,而只关注是否从文件中读取到某些数据,以及在读取到这些数据时所需执行的处理,此时可以使用nodejs中的文件流来执行。...在应用程序中各种对象之间交换和传输数据时,总是先将该对象中所包含的数据转换成各种形式的流数据(即字节数据),再通过流的传输,到达目的对象后再将流数据转换为该对象中可以使用的数据。
学到引入 json 文件的提案 5. JSON.parse 更友好的错误提示 6. 规范化 package 元数据 7. 等等 2. 场景 优雅的获取 package.json 文件。...如果模块里面还有一个数据文件 data.txt,那么就可以用下面的代码,获取这个数据文件的路径。...分别是用 fsPromises.readFile fs.readFileSync 读取 package.json 文件。 用 parse-json[15] 解析 json 文件。...path 中文文档[19] path 模块提供了用于处理文件和目录的路径的实用工具。 5.3 fs 文件模块 很常用的模块。...学到引入 json 文件的提案 5. JSON.parse 更友好的错误提示 6. 规范化 package 元数据 7.
什么时候使用GridFS 在MongoDB中,使用GridFS存储大于16 MB的文件。 在某些情况下,在MongoDB数据库中存储大型文件可能比在系统级文件系统上存储效率更高。...当你希望保持文件和元数据在多个系统和设施之间自动同步和部署时,可以使用GridFS。使用地理分布的复制集时,MongoDB可以自动将文件及其元数据分发到多个mongod实例和设施。...上传文件的新版本后,您可以原子更新元数据中指示为“最新”状态的字段,然后在需要时删除以前的版本。...默认情况下,GridFS使用两个集合以及一个名为fs的存储桶: fs.files fs.chunks 您可以选择其他存储桶名称,也可以在一个数据库中创建多个存储桶。...需要文件摘要的应用程序应在GridFS外部实现它,并将其存储在files.metadata中。 filemd5命令返回的完整文件的MD5哈希。此值为字符串类型。 files.filename 可选的。
; }) 上面的例子中,通过使用node自带的http模块,调用其http.creatServer方法在本机上开启了一个http服务,监听了本地的8000端口,代码逻辑很简单,当接收到一个req请求时...; }) 上例子中,先确定了一个数据模型data,内部一共有三个字段。这里的数据模型就是前端开发前与后端所定义的返回格式,最终前端要拿到这个JSON格式的数据在客户端进行处理。...但是上面例子中的接口和我们常用的接口有一个差异点,就是接口名称和返回内容均不规范,使用者直接通过没有路径的http://127.0.0.1:8000来使用接口,这跟我们日常使用的接口是完全不一样的,那我们接下来再看一下如何给提供一个规范化的接口呢...实例中的源码简单解析一下,当服务接收到请求时,先判断请求的api名称是不是事先约定好的/api/search/data,判断通过后,将前端传递在链接上的参数userId获取到,处理后插入到返回的json...而在Nodejs中,本身便提供了fs文件操作模块,这个模块模块底层并不是JavaScript来编写的,是具备操作文件的C++语言编写的,其封装完成后将上层暴露给Nodejs,然后便可以使用JavaScript
领取专属 10元无门槛券
手把手带您无忧上云