Nodejs之路(一)—— Nodejs入门
不知不觉,现在已经习惯学一点东西,就写博客记录一下。这次学习Nodejs主要是在B站上看的视频教程,感觉讲的很是不错,所以我想把在看视频学习过程中的一些重要知识点记录下来方便以后自己快速查阅。
-----注:这系列博客记录的知识点主要来源于黑马程序员的Nodejs视频教程,博主只是简单手动进行了代码复现和知识点记录,侵删
一.Node是什么?
1.Node.js是一个JavaScript运行时环境(可以解析和执行JavaScript代码)
2.现在的JavaScript可以完全脱离浏览器来运行,一切都归功于Node.js
3.浏览器中的JavaScript包括EcmaScript、BOM、DOM
4.Node.js中的JavaScript :没有BOM、DOM,用EcmaScript进行编码,主要是在Node这个JavaScript执行环境中为JavaScript提供一些服务器级别的API操作(例如文件读写、网络服务的构建、网络通信、http服务器等处理)
5.Node.js特性是 使用事件驱动、非阻塞IO模型(异步),使得其轻量和高效
6.npm是基于Node.js开发出来的包管理工具,npm是世界上最大的开源库生态系统,绝大多数js相关的包都存放在npm上,方便开发人员下载使用
7.Google Chrome的V8引擎是目前公认的解析执行JavaScript代码最快的,Node.js构建在Google Chrome的V8引擎之上,是一个独立的JavaScript运行时环境
8.Node.js能做的事:Web服务器后台、命令行工具(npm、git、hexo)
二.使用Node执行js脚本文件
1.创建编写JavaScript脚本文件
2.打开终端,定位到脚本文件所属目录
3.输入 node 文件名
来执行对应的脚本文件
注:①命令dir是用来显示文件或目录的命令 ②文件名不要用 node.js
来命名,最好也不要使用中文命名 ③浏览器端口默认为80
三.使用Node创建简单的http服务
- //在 Node 中专门提供了一个核心模块:http,可以非常轻松的构建一个web服务器
- //1.加载http核心模块
- var http = require('http')
- //2.使用http.createServer()方法创建一个Web服务器,返回一个Server实例
- var server = http.createServer()
- //3.接收请求、处理请求、给个反馈(发送相应)
- //当客户端请求过来,就会自动触发服务器的request请求事件,然后执行第二个参数:回调处理
- server.on('request',function(){
- console.log('收到客户端的请求了')
- })
- // 4.绑定端口号,启动服务器
- server.listen(3000,function(){
- console.log('服务器启动成功了,可以通过 http://127.0.0.1:3000/ 来进行访问')
- })
打开终端,定位到脚本文件所属目录,输入命令 node 文件名 ,显示如下:
浏览器输入 http://127.0.0.1:3000/ 后,命令行界面显示如下:
注: Node.js构建在Google Chrome的V8引擎之上,是一个独立的JavaScript运行时环境,可以脱离浏览器运行
四.响应内容类型Content-type
- var http = require('http')
- var server = http.createServer()
- server.on('request',function(req,res){
- //在服务端默认发送的数据其实是utf-8编码的内容
- //但是浏览器不知道你是utf-8编码的内容,在浏览器不知道服务器响应内容的编码的情况下会按照当前操作系统的默认编码去解析
- //中文操作系统默认是gbk
- //要让浏览器显示的数据不是乱码的,就需要告诉浏览器服务器发给它的内容是什么编码的,下面这行代码就可以解决这个问题
- var url = req.url
- if(url === '/plain'){
- // text/plain 就是普通文本 text/plain的意思是将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理
- res.setHeader('Content-Type','text/plain; charset=utf-8')
- res.end('hello 世界')
- }else if(url === '/html'){
- // text/html的意思是将文件的content-type设置为text/html的形式,浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理
- // 如果你发送的是 html 格式的字符串,则也要告诉浏览器我给你发送的是 text/html 格式的内容
- res.setHeader('Content-Type','text/html; charset=utf-8')
- res.end('<p>hello html <a href="">点我</a></p>')
- }
- })
- server.listen(3000,function(){
- console.log('Server is running.....,可以通过 http://127.0.0.1:3000/ 来进行访问')
- })
五.通过hhtp网络发送文件
发送的并不是文件,本质上发送的是文件的内容
当浏览器收到服务器响应内容之后,就会根据你的 Content-Type 进行对应的解析处理
服务器最好把每次响应的数据是什么内容类型都告诉客户端,而且要正确的告诉
不同资源对应的 Content-Type 是不一样的,具体参照:http://tool.oschina.net/commons
对于文本类型的数据,最好都加上编码,目的是为了防止中文解析乱码问题
- //1.结合fs发送文件中的数据
- //2.Content-Type 不同的资源对应的 Content-Type 是不一样的,图片不需要指定编码,一般只为字符数据指定编码
- var http = require('http')
- var fs = require('fs')
- var server = http.createServer()
- server.on('request',function(req,res){
- var url = req.url
- if(url === '/'){
- //发送的是在文件中的内容
- fs.readFile('./resource/index.html',function(err,data){
- if(err){
- //告诉客户端,读取失败
- res.setHeader('Content-Type','text/plain; charset=utf-8')
- res.end('文件读取失败,请稍后重试!')
- }else{
- //data默认是二进制数据,可以通过 .toString 转为咱们能识别的字符串
- //res.end()支持两种数据类型,一种是二进制,一种是字符串
- res.setHeader('Conten-Type','text/html; charset=utf-8')
- res.end(data)
- }
- })
- }else if(url==='/baby'){
- //url:统一资源定位符
- //一个 url 最终其实是要对应到一个资源的
- fs.readFile('./resource/ab2.jpg',function(err,data){
- if(err){
- //告诉客户端,读取失败
- res.setHeader('Content-Type','text/plain; charset=utf-8')
- res.end('文件读取失败,请稍后重试!')
- }else{
- //data默认是二进制数据,可以通过 .toString 转为咱们能识别的字符串(因为res.end也支持二进制的数据类型,所以这里也可以不用转)
- //res.end()支持两种数据类型,一种是二进制,一种是字符串
- //图片就不需要指定编码了,因为我们常说的编码指的是字符编码
- res.setHeader('Conten-Type','image/jpeg')
- res.end(data)
- }
- })
- }
- })
- server.listen(3000,function(){
- console.log('Server is running......')
- })
六.ip地址和端口号
1.所有联网的程序都需要进行网络通信。一台计算机只有一个物理网卡,而且同一个局域网中,网卡的ip地址必须是唯一的(网卡是通过唯一的ip地址来进行定位的)。
2.DNS: 域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务,是万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
3.①ip地址用来定位计算机 ②端口号用来定位具体的应用程序(所有需要联网通信的应用程序都必须占用一个端口号)
4.端口号的范围从0~65536之间
5.在计算机中有一些默认端口号,最好不要去使用(例如http服务的80)
6.在开发过程中使用一些简单好记的就可以了,例如3000、5000等没什么含义
7.浏览器默认使用的端口号是80,若要请求其他端口号,则一定要在ip地址后面给出来
8.可以同时开启多个服务,但一定要确保不同服务占用的端口号不一致才可以。说白了,在一台计算机中,同一个端口号同一时间只能被一个程序占用
七.一些知识点补充
1.hhtp服务的响应内容(res.end())只能是二进制数据或者字符串(注意:数字、对象、数组、布尔值都是不可以的)
2.JSON.stringify() 方法将 JavaScript 对象或数组转换为字符串。JSON.parse() 方法将字符串数据转换为 JavaScript 对象或数组。
3.Node为JavaScript提供了很多服务器级别的API,这些API绝大多数都被包装到了一个具名的核心模块中。例如文件操作的fs
核心模块,http服务构建的http
模块,path
路径操作模块、os
操作系统信息模块。以后如果说一个模块是核心模块,就要想到如果要使用它,就必须require,例如:
var fs = require('fs')
var http = require('http')
4.require 是一个方法,它的作用是用来加载模块的。在Node中,模块有两种:一是具名的核心模块,例如 fs、http;二是用户自己编写的文件模块(说白了就是js文件)。require加载用户自定义的模块时,require中的相对路径的 ./ 不能省略,否则会报错。补:后缀名也可以省略,require默认找的就是 .js 结尾的文件
5.在Node中,没有全局作用域,只有模块作用域(外部访问不到内部,内部也访问不到外部)
6.require 方法有两个作用:①加载文件模块并执行里面的代码②拿到被加载文件模块导出的接口对象(每个文件模块中都提供了一个对象---export,export默认是一个空对象,所有需要被外部访问的成员都需要挂载到exports这个对象中!)
例如:
a.js如下:
- var ret = require('./b')
- console.log(ret.foo)
- console.log(ret.add(10,30))
b.js如下:
- var foo = 'bbb'
- exports.foo = "hello"
- exports.add = function(x,y){
- return x+y
- }
命令行输入 node a.js 后,结果如下:
Nodejs之路(一)—— Nodejs入门的更多相关文章
- nodejs之路-[0]安装及简易配置
题外话: 之前写过ubuntu下编译nodejs- 传送门:Ubuntu15.04编译安装nodejsV0.12.3 只是如今基本在win下做开发了-. 就以这篇帖子为开头,作为我踏上nodejs之路 ...
- Nodejs ORM框架Sequelize快速入门
Nodejs ORM框架Sequelize快速入门 什么是ORM? 简单的讲就是对SQL查询语句的封装,让我们可以用OOP的方式操作数据库,优雅的生成安全.可维护的SQL代码.直观上,是一种Model ...
- nodejs学习笔记一——nodejs安装
a.nodejs安装 nodejs的安装没有什么说的默认安装即可.安装包官网下载即可:nodejs官网 本人用的是window的安装包node-v4.2.6-x64.msi 安装完成后打开命令行查看使 ...
- nodeJs学习过程之认识nodejs
nodeJs只是听说过,没见过,没玩过.从新手开始,我想慢慢掌握它. 一.首先,我想知道nodeJs是什么? 摘自百度百科: Node.js是一套用来编写高性能网络服务器的JavaScript工具包, ...
- 使用Termux,在手机上做nodejs编程,运行nodejs程序。
如果你是一名nodejs开发者,是否想过以下问题:在手机上运行nodejs程序?用手机当nodejs服务器?在手机上做nodejs编程?YES!使用Termux,以上都可以做到! 下面展示如何实现这个 ...
- Nodejs之路(二)—— Nodejs再入门
一.在Node中使用模板引擎 js代码: // art-template不仅可以在浏览器使用,也可以在node中使用 // 1.安装 npm install art-temlate模板引擎 // 2. ...
- 【NodeJS 学习笔记02】入门资源很重要
前言 在我映像中,异步最早出现与ajax,当时我还在搞.net,然后.net居然出了一个异步的控件...... 虽然我最后知道了他不是异步的......然后,前端异步用得特别多,如果不是异步的程序,你 ...
- 02 nodejs命令参数(NodeJS基础入门)
声明:本文章可供有一定js基础的朋友参考nodejs入门,本文未讲解nodejs的安装,如有需要的同学可以加QQ3382260752找我,进行交流学习. 建议使用开发软件:webstorm或hbuil ...
- NodeJS学习笔记 进阶 (13)Nodejs进阶:5分钟入门非对称加密用法
个人总结:读完这篇文章需要5分钟,这篇文章讲解了Node.js非对称加密算法的实现. 摘录自网络 地址: https://github.com/chyingp/nodejs-learning-guid ...
随机推荐
- C++ 系列:交换两个数字
1. 创建中间变量 这是最快也是最简单的办法,例如: #include<stdio.h> int main(){ int a=10; int b=20; int temp; printf( ...
- ipsec原理(转载)
IPSec VPN是目前VPN技术中点击率非常高的一种技术,同时提供VPN和信息加密两项技术,这一期专栏就来介绍一下IPSec VPN的原理.IPSec VPN应用场景 IPSec VPN的应用场景分 ...
- 【luoguP3868】猜数字
description 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n ...
- Windows start
启动一个单独的窗口以运行指定的程序或命令. START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] ...
- csps模拟86异或,取石子,优化题解
题面:https://www.cnblogs.com/Juve/articles/11736440.html 异或: 考试时只想出了暴力 我们可以对于二进制下每一位w,求出[l,r]中有几个数在这一位 ...
- platform模块和ctypes模块
一.ctypes模块 Python 的 ctypes 要使用 C 函数,需要先将 C 编译成动态链接库的形式,即 Windows 下的 .dll 文件,或者 Linux 下的 .so 文件.先来看一下 ...
- STM32F103 Feature
- floyd类型题UVa-10099-The Tourist Guide +Frogger POJ - 2253
The Tourist Guide Mr. G. works as a tourist guide. His current assignment is to take some tourists f ...
- substring常用的两种方法
1.public String substring(int beginIndex, int endIndex) 第一个参数int为开始的索引,对应String数字中的开始位置, 第二个参数是截止的索引 ...
- sparkStreaming结合sparkSql进行日志分析
package testimport java.util.Propertiesimport org.apache.spark.SparkConfimport org.apache.spark.Spar ...