node.js 基础操作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node.js 基础操作相关的知识,希望对你有一定的参考价值。
参考技术Arequire 函数用来在一个模块中引入另外一个模块。传入一个模块名,返回一个模块导出对象。用法: let cc = require("模块名") ,其中模块名可以用绝对路径也可以用相对路径,模块的后缀名.js可以省略。例如:
require()函数用两个作用:
exports 对象用来导出当前模块的公共方法或属性,别的模块通过 require 函数使用当前模块时得到的就是当前模块的 exports 对象。用法: exports.name ,name为导出的对象名。例子:
module.exports 用来导出一个默认对象,没有指定对象名,常见于修改模块的原始导出对象。比如原本模块导出的是一个对象,我们可以通过module.exports修改为导出一个函数。如下:
3.加载第三方包
Node.js中使用 CommonJs 模块化机制,通过 npm 下载的第三方包,我们在项目中引入第三方包都是: let xx = require(\'第三方包名\') ,究竟 require 方法加载第三方包的原理机制是什么,今天我们来探讨下。
require(\'第三方包名\') 优先在加载该包的模块的同级目录 node_modules 中查找第三方包。
找到该第三方包中的 package.json 文件,并且找到里面的 main 属性对应的入口模块,该入口模块即为加载的第三方模块。
如果在要加载的第三方包中没有找到 package.json 文件或者是 package.json 文件中没有 main 属性,则默认加载第三方包中的 index.js 文件。
如果在加载第三方模块的文件的同级目录没有找到 node_modules 文件夹,或者以上所有情况都没有找到,则会向上一级父级目录下查找 node_modules 文件夹,查找规则如上一致。
如果一直找到该模块的磁盘根路径都没有找到,则会报错: can not find module xxx 。
4.npm命令
npm 英文全称: node package manager ,npm 为你和你的团队打开了连接整个 javascript 天才世界的一扇大门。它是世界上最大的软件注册表,每星期大约有 30 亿次的下载量,包含超过 600000 个 包(package) (即,代码模块)。来自各大洲的开源软件开发者使用 npm 互相分享和借鉴。包的结构使您能够轻松跟踪依赖项和版本。我们平时开发项目都是需要使用npm下载依赖,常见的npm命令总结如下:
5.文件读取
var fs = require(\'fs\')
同步:
var content = fs.readFileSync(\'hello.txt\',flag:\'r\',encoding:"utf-8")
异步(默认):
flag:读取模式
encoding:编码格式
7.文件写入
var fs = require(\'fs\')
格式:write=>w read=>r append =>a
异步:
8.文件删除
fs . unlink ( \'lc.txt\' , function ()
9.buffer缓冲区
1、数组不能进行二进制数据的操作2、js数组不像java、python等语言效率高3、buffer内存空间开辟出固定大小的内存
let buf1 = Buffer.alloc(10)
console.log(buf1)
allocUnsafe(之前的一些内容)(效率高)
10.文件目录
var fs = require(\'fs\')
fs.readdir(path,callback)
导入 readline 包
let readline = require(\'readline\');
实例化接口对象(process对象,stdout/in输入输出)
question方法 提问
close 事件监听
11.文件流
var fs = require(\'fs\')
语法: fs.createWriteStream(文件路径,【可选的配置操作】)
let ws = fs.createWriteStream("hello.txt",flags:"w",encoding:"utf-8");
let ws = fs.createWriteStream("hello.txt",flags:"w",encoding:"utf-8");
实践
fs.createReadStream(路径,【可选的配置项】)
文档
let rs = fs.createReadStream(\'hello.txt\',flags:\'r\',encoding:"utf-8")
音乐
let rs = fs.createReadStream(\'snake.mp4\',flags:\'r\')
读取时写入
let ws = fs.createWriteStream(\'a.txt\',flags:"w",encoding:"utf-8")
createReadStream.pipe(createWriteStream)
链式是通过连接输出流到另外一个流并创建多个流操作链的机制。链式流一般用于管道操作。
接下来我们就是用管道和链式来压缩和解压文件。
创建 compress.js 文件, 代码如下:
代码执行结果如下:
执行完以上操作后,我们可以看到当前目录下生成了 input.txt 的压缩文件 input.txt.gz。
接下来,让我们来解压该文件,创建 decompress.js 文件,代码如下:
12.node事件
Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
Node.js 几乎每一个 API 都是支持回调函数的。
Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.
没有使用 events 包 仅使用JavaScript事件监听进行事件驱动
Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。
这个模型非常高效可扩展性非常强,因为 webserver 一直接受请求而不等待任何读写操作。(这也称之为非阻塞式IO或者事件驱动IO)
在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。
Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:
以下程序绑定事件处理程序:
我们可以通过程序触发事件:
接下来让我们执行以上代码:
在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。
接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:
创建 main.js 文件,代码如下:
以上程序中 fs.readFile() 是异步函数用于读取文件。如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。
如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。
执行以上代码,执行结果如下:
接下来我们删除 input.txt 文件,执行结果如下所示:
因为文件 input.txt 不存在,所以输出了错误信息。
Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。
Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.readStream 对象会在文件被打开的时候触发一个事件。所有这些产生事件的对象都是 events.EventEmitter 的实例。
events 模块只提供了一个对象:events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。
你可以通过require("events");来访问该模块。
EventEmitter 对象如果在实例化时发生错误,会触发 error 事件。当添加新的监听器时,newListener 事件会触发,当监听器被移除时,removeListener 事件被触发。
下面我们用一个简单的例子说明 EventEmitter 的用法:
执行结果如下:
运行这段代码,1 秒后控制台输出了 \'some_event 事件触发\' 。其原理是 event 对象注册了事件 some_event 的一个监听器,然后我们通过 setTimeout 在 1000 毫秒以后向 event 对象发送事件 some_event,此时会调用some_event 的监听器。
EventEmitter 的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter 支持 若干个事件监听器。
当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。
让我们以下面的例子解释这个过程:
执行以上代码,运行的结果如下:
以上例子中,emitter 为事件 someEvent 注册了两个事件监听器,然后触发了 someEvent 事件。
运行结果中可以看到两个事件监听器回调函数被先后调用。这就是EventEmitter最简单的用法。
EventEmitter 提供了多个属性,如 on 和 emit 。 on 函数用于绑定事件函数, emit 属性用于触发一个事件。接下来我们来具体看下 EventEmitter 的属性介绍。
node.js零基础详细教程:node.js操作mongodb,及操作方法的封装
第七章 建议学习时间4小时 课程共10章
学习方式:详细阅读,并手动实现相关代码
学习目标:此教程将教会大家 安装Node、搭建服务器、express、mysql、mongodb、编写后台业务逻辑、编写接口,最后完成一个完整的项目后台,预计共10天课程。
node.js操作mangodb
创建一个用于放置今天文件的文件夹,npm init初始化一下,并创建demo1.js用于写node代码
使用
npm install mongodb@2.2.33
,将mongodb控制模块安装到本地 (由于后来的mongodb版本操作方法有改变,这里使用 @2.2.33来安装这个版本,下图是后来换的,所以和前面命令行的截图风格不同)
在demo1.js中写入下面操作代码
1 var mongo = require("mongodb"); //引入mongodb模块 2 var assert = require("assert"); //引入断言模块 3 4 var MongoClient = mongo.MongoClient; //开启服务 5 6 var Urls = "mongodb://localhost:27017/demo2"; //url储存 放在连接池中。 7 8 MongoClient.connect(Urls,function(err,db){ //获取连接 9 assert.equal(null,err); //使用断言模块代替以前的 if判断 10 11 12 //插入数据 13 db.collection("t1").insert({"name":"xiaoming"},function(err,result){ //连接到数据库上面,并使用参数传入集合 14 assert.equal(null,err); 15 console.log(result); 16 db.close(); 17 }); 18 19 20 });
代码解释:
1行2行引入了需要的两个模块,4行开启服务器,
6行是url的地址,一般默认安装的时候地址和端口是 “mongodb://localhost:27017”,后面的demo2是我的mongodb的数据库的名字(你替换成你自己创建的数据库即可)
8行是根据上面声明的url去和数据库建立连接,connect方法有两个参数,1、连接的数据库地址,2、回调函数,回调函数两个参数表示发送错误,以及正确的情况下返回数据库的链接,我们就可以在此链接上进行操作了。
注意:这里的链接是初学者常报错的地方,如果报错,去确认地址和数据库名字是否填错,确保自己的数据库中有对应的库名字。
重点讲解下 13行,这里是node插入数据库的操作, db.collection("t1")表示获取需要操作的表, insert是插入方法,方法接收两个参数,1、插入的内容,2、回调函数,回调函数两个参数表示发送错误,以及正确的情况下返回的结果。
15行打印出错结果,16行关闭和数据库的链接(如果一直连着,浏览器会崩溃)
执行demo1.js。成功即可得到下图结果 ( 划线处的 n表示成功了1条 )
查询数据库,可以看到新添加的数据
查找: find方法,传入查找筛选的json(如果不传,就查询全部),后面的toArray是将数据作处理之后变成我们可以识别的数组格式
后面的操作,除了中部的数据操作部分代码不同,其余代码都是相同的。
1 var mongo = require("mongodb"); //引入mongodb模块 2 var assert = require("assert"); //引入断言模块 3 4 var MongoClient = mongo.MongoClient; //开启服务 5 6 var Urls = "mongodb://localhost:27017/demo2"; //url储存 放在连接池中。 7 8 MongoClient.connect(Urls,function(err,db){ //获取连接 9 assert.equal(null,err); //使用断言模块代替以前的 if判断 10 11 12 //查找数据 13 db.collection("t1").find({"name":"xiaoming"}).toArray(function(err,result){ 14 assert.equal(null,err); 15 console.log(result); 16 db.close(); 17 }) 18 19 20 });
运行,成功查找到上一步插入的数据
删除 使用 deleteOne删除一条数据,两个参数 1、删除的查找json 2、回调函数
1 var mongo = require("mongodb"); //引入mongodb模块 2 var assert = require("assert"); //引入断言模块 3 4 var MongoClient = mongo.MongoClient; //开启服务 5 6 var Urls = "mongodb://localhost:27017/demo2"; //url储存 放在连接池中。 7 8 MongoClient.connect(Urls,function(err,db){ //获取连接 9 assert.equal(null,err); //使用断言模块代替以前的 if判断 10 11 //删除数据 12 db.collection("t1").deleteOne({"name":"xiaoming"},function(err,result){ //连接到数据库上面,并使用参数传入集合 13 assert.equal(null,err); 14 console.log(result); 15 db.close(); 16 }); 17 18 });
执行,成功的结果
查询数据库发现 xiaoming那条数据被删除了
修改: 使用 update方法,包括三个参数,1、查询条件,2、修改的字段以及修改器,3、回调函数
var mongo = require("mongodb"); //引入mongodb模块 var assert = require("assert"); //引入断言模块 var MongoClient = mongo.MongoClient; //开启服务 var Urls = "mongodb://localhost:27017/demo2"; //url储存 放在连接池中。 MongoClient.connect(Urls,function(err,db){ //获取连接 assert.equal(null,err); //使用断言模块代替以前的 if判断 //修改数据 db.collection("t1").update({"name":"zhangsan1"},{$set:{"name":"xiaoming"}},function(err,result){ //连接到数据库上面,并使用参数传入集合 assert.equal(null,err); console.log(result); db.close(); }); });
运行成功的结果
查询数据库发现,原来的zhangsan1被修改成了xiaoming
到这里,就实现了通过nodejs增删改查mongodb数据库
封装增删改查的代码
创建一个封装js的文件 dbhandler.js ,将下列代码复制进去(封装的代码文字解说太困难,这里就不解释了,只给大家介绍如何使用,以后可能会出视频教程,到时候再详细解释这个封装)
-- 注:第6行的url后面的数据库 替换成自己要操作的数据库,其他都不用变
var mongo=require("mongodb");//@2.2.11 var MongoClient = mongo.MongoClient; var assert = require(\'assert\'); var host="localhost"; var port="27017"; var Urls = \'mongodb://localhost:27017/demo2\'; //add一条数据 var add = function(db,collections,selector,fn){ var collection = db.collection(collections); collection.insertMany([selector],function(err,result){ assert.equal(err,null); fn(result); db.close(); }); } //delete var deletes = function(db,collections,selector,fn){ var collection = db.collection(collections); collection.deleteOne(selector,function(err,result){ try{assert.equal(err,null)}catch(e){ console.log(e); } fn(result); db.close(); }); }; //find var find = function(db,collections,selector,fn){ var collection = db.collection(collections); collection.find(selector).toArray(function(err,docs){ try{ assert.equal(err,null); }catch(e){ console.log(e); docs = []; } fn(docs); db.close(); }); } //(权限控制) -- 暂时没有用 MongoClient.connect(Urls, function(err, db) { find(db,"powers",null,function(d){ console.log("123s"); console.log(d.length); }); }); //update var updates = function(db,collections,selector,fn){ var collection = db.collection(collections); console.log(selector); collection.updateOne(selector[0],selector[1],function(err,result){ assert.equal(err,null); assert.equal(1,result.result.n); fn(result); db.close(); }); } //方法都赋值到操作对象上,便于调用 var methodType = { login:find, show:find, add:add, getpower:find, update:updates, delete:deletes, updatepass:updates, adduser:add, usershow:find, getcategory:find, getcourse:find, find:find, state:find, top:find, AddDirectory:find, updateDirectory:updates, deleteDirectory:deletes, showlist:find, showdir:find }; //主逻辑 module.exports = function(req,res,collections,selector,fn){ MongoClient.connect(Urls, function(err, db) { assert.equal(null, err); console.log("Connected correctly to server"); methodType[req.query.action](db,collections,selector,fn); db.close(); }); };
使用这个封装
具体的封装的使用方法,我们将在下一节课项目中去介绍
今天就讲到这里,明天我们讲解:项目的创建,后台数据请求接口的编写
关注公众号,博客更新即可收到推送
以上是关于node.js 基础操作的主要内容,如果未能解决你的问题,请参考以下文章
安装使用Mongoose配合Node.js操作MongoDB的基础教程转载