1、通过在node里面运行 console.log(arguments.callee+"")
(后面加上字符串是为了转化为string类型)
function (exports, require, module, __filename, __dirname) {
console.log(arguments.callee+"")
}
说明在node里面始终是函数作用域,在node里面有一个全局对象global,它的作用和网页中的window类似,
当node在执行模块中的代码时他会在上下加入函数
function (exports, require, module, __filename, __dirname) {
}
exports:该对象,将函数作用域的东西暴露出去
require:函数,引入外部模块的东西
module: 函数本身,在导出时使用exports.name="zhangsan"和module.exports.name="zhangsan";是一样的
__filename:'C:\\Users\\Alan\\WebstormProjects\\nodeText\\a.js'
文件的路径
__dirname:'C:\\Users\\Alan\\WebstormProjects\\nodeText';
文件所在文件夹的路径
2 node中通过require来引入模块,模块里面的内容为函数作用域,引用后 直接拿不到
需要将变量exports,后面引入后才能使用; 如
math.js:
exports.add=function(a,b){
return a+b;
}
a.js:
var math=require('./math.js');
var math=require('./math');
这两种写法都对
math.add(12,34);
模块分两种:
核心模块 :node自带或者npm自己下载的模块
var fs=require('fs');
直接引入,不用写路径
文件模块:用户自己创建的模块
var math=require('./math.js');
需要引入文件的路径(绝对路径、相对路径)
3、module.exports和exports的关系:
var module=new object();
var exports=module.exports;将exports的内存地址指向module.exports的地址
exports.name="Xx";通过 . 的方式能够改变module.exports.name的值,
但是不能直接exports={}创建对象(对象能创建成,但是不能存东西)
只能通过module.exports={}的形式创建对象;
当多个属性需要导出的话,我们用module.exports={
name:"xxx",
say:function () {
console.log("说出我的名字")
}
}
最后return 返回的是module.exports
3+、
导出多个元素
exports.s='aaa'
exports.a='bbbb'
exports.c='cccc'
module.exports.d='adadadadada'
结果:
{ s: 'aaa', a: 'bbbb', c: 'cccc', d: 'adadadadada' }
但是一旦导出对象就会把前面的覆盖
exports.s='aaa'
exports.a='bbbb'
exports.c='cccc'
module.exports.d='adadadadada'
module.exports=function(){
cc:'aa'
}
module.exports={
ad:'nihao '
}
console:
{ ad: 'nihao ' }
exports指向的是module.exports的内存地址,只要exports不改变内存地址,exports能改变module.exports的值,可以一同导出,一但exports改变内存地址,expors改动的值就和导出的值没有关系了
module.exports.s='adadadadada'
exports.s='ccc'
exports=function () {
console.log("aa")
}
exports.a='bbb'
console:
{ s: 'ccc' }
4、npm的命令
- npm -v 查看npm版本
- npm search 包名 搜索包
- npm install / i 包名 安装包
- npm install 包名 - g 全局安装包(全局安装包一般都是一些工具)
- npm remove / r 包名 删除包
- npm install 下载当前项目所依赖的包
5、buffer缓冲区
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。 但在处理像TCP流或文件流时,必须使用到二进制数据。因此在Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
1. 创建一个长度为 10、且用 0 填充的 Buffer。
const buf1 = Buffer.alloc(10);
2、创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([1, 2, 3]);
6、同步文件写入
fs.openSync(path[, flags, mode])
[ 里面的东西为选填]
path:为文件的路径
flag:默认为r:打开文件用于读取。如果文件不存在会异常 w:打开文件用于写入。 如果文件不存在则创建文件,如果文件存在则截断文件。
mode设置文件的操作权限
fs.writeSync(fd, string[, position[, encoding]])
fd为文件
string为写入的内容
position为写入的开始位置
enconding为结束位置
fs.closeSync(fd)
fd为关闭的文件名字
var fs=require("fs");//fs文件系统
var fd=fs.openSync("node.txt","w");
fs.writeSync(fd, "写入测试",4);
fs.closeSync(fd)
7、
var fs=require("fs");
fs.open("hello.txt","w",function(err,fd) {
if (!err){
console.log("文件已打开")
fs.write(fd,"文件写入的内容",function(err) {
if (!err){
console.log("文件写入完成");
}
fs.close(fd,function(err) {
if (!err){
console.log("文件已经关闭")
}
})
})
}
})
console.log("程序向下执行");
8、写入简单文件
//简单文件写入
var fs=require("fs");
fs.writeFile("hello.txt","这是我们写入的内容",function (err) {
if (!err){
console.log("写入成功")
}
})
一般options都不填为默认,
当 flag 选项采用字符串时,则以下标志均可用:
'a': 打开文件用于追加。 如果文件不存在,则创建该文件。
'ax': 类似于 'a',但如果路径存在,则失败。
'a+': 打开文件用于读取和追加。 如果文件不存在,则创建该文件。
'ax+': 类似于 'a+',但如果路径存在,则失败。
'as': 打开文件用于追加(在同步模式中)。 如果文件不存在,则创建该文件。
'as+': 打开文件用于读取和追加(在同步模式中)。 如果文件不存在,则创建该文件。
'r': 打开文件用于读取。 如果文件不存在,则会发生异常。
'r+': 打开文件用于读取和写入。 如果文件不存在,则会发生异常。
'rs+': 打开文件用于读取和写入(在同步模式中)。 指示操作系统绕过本地的文件系统缓存。
这对于在 NFS 挂载上打开文件时非常有用,因为它可以跳过可能过时的本地缓存。 它对 I/O 性能有非常实际的影响,因此不建议使用此标志(除非真的需要)。
这不会把 fs.open() 或 fsPromises.open() 变成同步的阻塞调用。 如果需要同步的操作,则应使用 fs.openSync() 之类的。
'w': 打开文件用于写入。 如果文件不存在则创建文件,如果文件存在则截断文件。
'wx': 类似于 'w',但如果路径存在,则失败。
'w+': 打开文件用于读取和写入。 如果文件不存在则创建文件,如果文件存在则截断文件。
'wx+': 类似于 'w+',但如果路径存在,则失败。
9、流式文件的写入
//流式文件写入
var fs=require("fs");
var ws=fs.createWriteStream("hello2.txt");
ws.once("open",function () {
console.log("流开启了")
})
ws.once("close",function () {
console.log("流关闭了")
})
ws.write("congtuletions");
ws.write("1111");
ws.write("222");
ws.close();
// ws.end();
10、简单的文件读取
//简单文件读取
var fs=require("fs");
fs.readFile("node.txt",function (err,data) {
if (!err){
console.log("文件读取成功")
fs.writeFile("a.txt",data,function (err) {
if (!err){
console.log("文件写入成功")
}
})
}
})
var a=fs.readFileSync("node.txt");
fs.writeFileSync("b.txt",a);
11、流文件的读取
//流文件读取
var fs=require("fs");
var rs=fs.createReadStream("a.txt");
var ws=fs.createWriteStream("d.txt");
rs.on("data", function (data) {
ws.write(data);
})
ws.close();
// rs.pipe(ws);
使用on和pipe效果是一样的