node.js学习笔记一

js运行环境?

js运行在浏览器内核中的JS引擎

浏览器:
请求一个HTTP地址,将一个url地址封装成一个请求报文,将响应报文解析

响应报文:
    html ----->渲染html
    css---->渲染css
    image---->渲染图片
    js---->解释执行js

浏览器中的js可以做什么?

操作DOM,增删改,注册事件

AJAX、跨域

BOM----页面跳转、历史记录、console.log()、alert()...

ECMAScript

浏览器中的js不能做什么?

文件操作----文件和文件夹的增删改查

对操作系统的信息的操作

由于js运行环境特殊,为了安全,我们写的代码是在不认识的人的浏览器中运行

编程语言的能力取决于什么?

取决于这个语言的运行平台(环境)。

我们常说的JS实际是ES,它的大部分能力都是由浏览器的执行引擎决定,BOM和DOM可以说是浏览器提供的接口

Java即是语言,也是平台。Java运行在Java虚拟机(跨操作系统)

c#语言, 平台是 .net framework(windows系统)

PHP即是语言也是平台

JS只能运行在浏览器中吗?

不是,能运行在哪,取决于这个环境有没有特定的平台

Node.js建立在V8引擎(Chrome中的js引擎)上,采用事件驱动、非阻塞的I/O模型,通过自行开发的libuv库,调用操作系统资源。

Node.js----JS在服务端的运行环境,类似于JAVA的虚拟机

Node.js----提供一些JS对文件的直接操作、网络操作、操作系统信息等

Node.js----选择了JS语言

Node.js作用:

做网站,处理浏览器请求

分发数据请求:User Browser<-->node server<-->Application server(传统java, .net, php..)提供服务接口

安装

方式一:下载node.js安装包直接安装,不推荐,更新时比较麻烦

方式二:NVM方式----nvm是一个可以让你在同一台机器上安装和切换不同版本node的工具,不同版本存在api不太一样,不同版本的系统对node的不同版本支持情况不同

下载nvm-windows,解压到全英文路径,建议开发相关的放在c盘

在根目录下找到settings.txt文件(如果没有,就自己创建),修改该文件

    settings.txt:
        root: C:\dev\nvm----nvm.exe的路径
        path: C:\dev----node.js快捷方式放在哪里
        arch: 64----操作系统位数
        proxy:----下载node先关文件时使用的代理

配置环境变量:

    新建用户变量:变量名:NVM_HOME;变量值:C:\dev\nvm
    `NVM_HOME=当前nvm.exe所在的目录`
    同理:`NVM_SYMLINK=node快捷方式所在的目录`
    添加进PATH:`PATH += %NVM_HOME%;%NVM_SYMLINK%`

配置完,打开cmd,通过set命令查看是否配置成:set NVM_HOME 其他两个也一样

nvm use 5.7.0-----使用node5.7.0版本,创建该版本的快捷方式

环境变量:----变量名不区分大小写,Linux系统例外

用户变量的配置只对当前登录系统的用户起作用

系统变量则对所有用户起作用

命令行/Shell命令:

pwd获取当前路径---windows下只能用在shell中

mkdir创建目录,甚至可以创建以点开头的文件夹

clear清空当前控制台

del 删除文件,在shell/linux中是rm

echo输出   echo 'hello' >> 1.txt

cat查看文件内容

REPL环境,在shell直接node就可进入

可以测试js代码, .exit可以退出这个环境,就是调用了process.exit()方法

node --use_strict进入严格模式

_下划线表示上次执行结果

node编辑推荐使用Visual Studio Code----既是一个浏览器,又是一个node环境模拟器

node不能做BOM/DOM操作,但它也提供了console.log(),console.error(new Error('error'))打印错误对象

shell命令行

node demo.js执行js文件

全局对象----global,类似于window对象

process----对进程的操作

清空控制台当前显示窗口:

做法一:

var height = process.stdout.getWindowSize();//[宽度,高度]

var height = process.stdout.getWindowSize()[1];//获取当前窗口的高度

for (var i = 0; i < height; i ++) {

    process.stdout.write('\n')
}//用回车将当前创窗口望上挤


做法二:

process.stdout.write('\033[2J');

process.stdout.write('\033[0f');

------------------------------------------------

setInterval(() => {
    console.log("你好,这个世界!");
}, 500);//每半秒输出一次

//如果通过命令行来执行该文件,下面实现按两次control + c退出程序

let exiting = false;//用来判断此时有没有按下过^C

process.on('SIGINT', () => {//对该进程注册一个SIGINT事件,该事件在按下^C的时候出发
    if (exiting) {//exiting为真,表明已经按下过一次
        console.log("再见,这个世界!");
        process.exit();//退出当前进程
    } else {
        //第一次按下
        console.log("第一次按下^C,再按一次退出");
        exiting = true;
        setTimeout(() => {
            exiting = false;
        }, 3000)//如果第一次按下^C超过3秒,这次按下不作数,重新开始统计
    }
})
 

---------------------------------------

on------用来注册事件

process.stdin.on('data', (data) => {//当有数据输入的时候,回车后就触发
process.stdout.write(data);
});

//用户名和密码验证

var q = "请输入用户名";

var users = {
        'admin': '123',
        'user1': '321',
        'user2': '110'
};

//输出第一个问题,提示用户
process.stdout.write(q + '\n');
//设置一个标志,用来指示此时输入的是用户名还是密码
// var isInputUeserName = true;

var userName = '';//接受用户输入

// var res = process.stdin.readline();//用户操作无状态,所以不能认为代码执行到这里用户会输入
//input其实是流,即二进制数组
process.stdin.on('data', (input) => {
    //获得一个键值对集合中所有的键
    //input内容多加了一个回车符,要将这个回车符去掉
    //trim()方法用来除去两头空格
    //要知道到底input是用户名还是密码
    input = input.toString().trim();
    if (!userName) {//userName还没有接受用户名时
        //Object.keys()获取一个键值对(对象)中所有的键,得到键组成的数组
        //arr.indexOf(要找的值)找一个数组中是否有某个元素,如果存在,返回该元素的下标,如果不存在,返回-1
        if(Object.keys(users).indexOf(input) === -1) {
            //用户名不存在
            process.stdout.write("用户名不存在" + '\n');
            // isInputUeserName = true;
            userName = '';
        } else {
            //用户名存在
            process.stdout.write("请输入密码\n");
            // isInputUeserName = false;
            userName = input;
        }
    } else {
        //此时传入密码,此处拿不到上次的输入,要先记录
        // console.log("此时传入密码");
        if (input === users[userName]) {
            console.log("登陆成功!");
        } else {
            process.stdout.write("请输入密码\n");
        }
    }

});
-------------------------

异步操作----当需要等待一个无状态的操作时

node中所有会发生阻塞的才做都是异步的

console.time('main')//代码计时器
code
code
...
console.timeEnd('main');//打印中间code执行时间

setTimeout(比较耗时的函数操作, 0);//功能是将该函数作为回调函数放在事件队列的最后,但和其他操作有关联时要注意

node中多采用回调函数的方式处理异步任务----当资源获取成功后再调取某函数执行

回调函数放在函数参数的最后, function fun (path, callback回调函数) {}

回调函数错误优先----回调函数的第一个参数是错误对象

在异步操作中如果发生异常,无法通过try...catch拿到错误信息,那么就通过回调函数的第一个参数取到错误信息

举例:判断用户名是否是字符串

let isString(username, callback) {
    if (typeof username === 'string'){//如果得到的是字符串
        callback(null, '是字符串')//没有抛出错误信息
    } else {
        callback(new Error('不是字符串'))//抛出一个错误对象
    }
}

//函数调用
isString('12ycni', (error, data) => {
    if (error) throw error;//如果有错误信息,则抛出异常  
    console.log(data);
})

isString(1, (error, data) => {
    if (error) throw error;//如果有错误信息,则抛出异常  
    console.log(data);
})

执行结果:

F:\fore-end\materials\node.js\projs\proj2\error.js:16
        if (error) throw error;//如果有错误信息,则抛出异常
                   ^
----上面是说明哪里抛出了异常,下面是我们新建的error对象的抛出----

Error: 不是字符串
    at isString (F:\fore-end\materials\node.js\projs\proj2\error.js:5:12)
    at Object. (F:\fore-end\materials\node.js\projs\proj2\error.js:15:1)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.runMain (module.js:604:10)
    at run (bootstrap_node.js:389:7)
    at startup (bootstrap_node.js:149:9)

解释一下js中异常(出错)的处理

JS中的错误类型:

1.SyntaxError: 语法错误
2.ReferenceError: 引用错误 要用的东西没找到
3.RangeError: 范围错误  专指参数超范围
4.TypeError: 类型错误  错误的调用了对象的方法
5.EvalError: eval()方法错误的使用
6.URIError: url地址错误

当发生错误时,JavaScript 引擎通常会停止,并生成一个错误消息,自动创建一个error对象。

Error对象是封装错误信息的对象,在发生错误时,自动创建

两个属性:
err.name :错误的名称/错误的类型
err.message: 错误的提示信息

使用方式有:Throw、Try 和 Catch

try
  {
  //在这里运行代码
  }
catch(err)
  {
  //在这里处理错误
  }

throw 语句允许我们创建自定义错误。

copy一个W3School上面的例子:

http://www.w3school.com.cn/tiy/t.asp?f=js_throw_error







我的第一个 JavaScript 程序

请输入 5 到 10 之间的数字:

对于throw,如果我们单纯的像上面例子里面,抛出一个字符串信息,当我们的程序比较长的时候,就很难定位出错位置,所以,我们更多的使用一个自定义的错误对象,就如判断用户名是否是字符串例子一样

你可能感兴趣的:(node.js学习笔记一)