node第一天
- node环境安装
node下载
直接去node官网下载
LTS版:长期支持版(稳定版)
Current:体验版
安装
傻瓜式一路next
查看版本
打开控制台输入 node --version,会得到node版本号
查看npm
npm是node.js的包管理工具,npm在node.js安装的时候已经顺带装好了,在控制台输入npm --version,可以看到类似的输出
- 使用node执行js脚本
创建编写js脚本(即js文件)
打开终端(控制台)定位到脚本文件所在目录
输入node文件名执行对应的文件
要注意:不能使用node作为js文件的名字
- Hello Node!
浏览器中的JavaScript是没有文件操作能力的,但是node中的JavaScript具有文件操作的能力
读取文件
//fs是file-system的简写,就是文件系统的意思
//在Node中,如果想要进行文件操作,就必须引入fs这个核心模块
//在fs这个核心模块中,提供了所有的文件操作相关的API
//例如:fs.readFile就是用来读取文件的
//1.使用require方法加载fs核心模块
var fs=require('fs');
//2.读取文件
//第一个参数是要读取的文件路径
//第二个参数是一个回调函数
/*
读取成功
data 是读取到的数据
error null
读取失败
data null
error 错误对象
*/
fs.readFile('hello.txt',function (error,data) {
// 回调函数里的两个参数,第一个是错误对象,第二个是数据,位置不可以颠倒
console.log(data.toString())
});
3. 写文件和简单的错误处理
写入文件
var fs=require('fs');
//第一个参数:文件路径
//第二个参数:文件内容
// 第三个参数:回调函数
/*
error
成功:文件写入成功
error是null
失败:文件写入失败
error是错误对象
*/
fs.writeFile('Hello.txt','大家好,我是node',function(error){
console.log("文件写入成功")
})
新写入的内容会将原来的内容覆盖掉
var fs=require('fs');
//第一个参数:文件路径
//第二个参数:文件内容
// 第三个参数:回调函数
/*
error
成功:文件写入成功
error是null
失败:文件写入失败
error是错误对象
*/
fs.writeFile('Hello.txt','大家好,我是node',function(error){
console.log("文件写入成功")
})
fs.readFile("Hello.txt",function (error,data) {
console.log(data.toString())
})
运行结果:
错误处理
var fs=require('fs');
fs.readFile("Hello2.txt",function (error,data) {
//注意此时我们要读的是Hello2.txt,此文件并不存在
console.log(data)
})
/*if(第一个参数文件路径==true){
把原来的内容覆盖掉
}else{
在该路径下新建该文件
}*/
运行结果:
此时Hello2.txt并不存在,所以读取并不成功,在这里报undefined,而实际上这里应该是一个错误。
var fs=require('fs');
fs.readFile("Hello2.txt",function (error,data) {
//注意此时我们要读的是Hello2.txt,此文件并不存在
console.log(error)
})
运行结果:
通过判断error是否存在,来确认是否有错误
var fs=require('fs');
fs.readFile("Hello2.txt",function (error,data) {
//注意此时我们要读的是Hello2.txt,此文件并不存在
console.log(error)
if (error) {
console.log("读取文件失败")
return
}
console.log(data.toString())
})
运行结果:
写入错误也类似
var fs=require('fs');
fs.writeFile("Hello2***.txt","大家好,我是node",function (error) {
//注意此时我们要读的是Hello2***.txt,windows系统不允许文件名中有“*”,所以本次写入会失败
console.log(error)
if (error) {
console.log("读取文件失败")
}
})
运行结果:
4. 简单的http服务
使用Node构建一个web服务器
//1.加载http核心模块
var http=require('http');
// 2.使用htpp。createServer( )创建一个web服务器
// 返回一个Server实例
var server=http.createServer();
//3.服务器的作用
/*
提供服务:对数据的服务
发送请求
接受请求
处理请求
给个反馈(发送响应)
注册request请求事件
当客户端请求过来,自动触发服务器的request请求时间,然后执行第二个参数,:回调函数
*/
server.on('request',function(){
console.log("收到客户端请求")
})
// 4.绑定端口号,启动服务器(凡是涉及到网络的,都有端口号)
server.listen(3000,function(){
console.log("服务器启动成功")
})
命令行启动
到浏览器输入http:127.0.0.1:3000,再查看终端
4. 发送响应
var http=require('http');
var server=http.createServer();
/*
request请求事件处理函数,需要接受两个参数
Request请求对象
请求对象可以用来获取客户端的一些请求信息,例如请求路径
Response响应对象
相对应对象可以用来给客户端发送响应消息
*/
server.on('request',function(request,response){
console.log("收到客户端请求,请求路径是:"+request.url)
})
server.listen(3000,function(){
console.log("服务器启动成功")
})
打开浏览器,输入http://127.0.0.1:3000/,再查看终端打开浏览器,输入http://127.0.0.1:3000/,再查看终端
尝试把浏览器url修改成http://127.0.0.1:3000/s/s/w等,这个时候终端是这样的
也就是说这里获取到的request就是我们浏览器url端口号后面的字符串
并且都是以“/”开头的
5. 根据不同请求路径返回不同数据
var http=require('http');
var server=http.createServer();
/*
request请求事件处理函数,需要接受两个参数
Request请求对象
请求对象可以用来获取客户端的一些请求信息,例如请求路径
Response响应对象
相对应对象可以用来给客户端发送响应消息
*/
server.on('request',function(request,response){
//console.log("收到客户端请求,请求路径是:"+request.url)
var url=request.url;
if(url==='/'){
response.end("index page");
}else if(url==='/login'){
response.end('login page')
}else{
response.end('404 page')
}
})
server.listen(3000,function(){
console.log("服务器启动成功")
})
var http=require('http');
var server=http.createServer();
/*
request请求事件处理函数,需要接受两个参数
Request请求对象
请求对象可以用来获取客户端的一些请求信息,例如请求路径
Response响应对象
相对应对象可以用来给客户端发送响应消息
*/
server.on('request',function(request,response){
//console.log("收到客户端请求,请求路径是:"+request.url)
var url=request.url;
if(url==='/products'){
var products=[
{name:"apple X",price:"8999"},
{name:"mate30 ",price:"5999"},
{name:"mate40 pro",price:"12000"}
];
response.end(JSON.stringify(products))
}
})
server.listen(3000,function(){
console.log("服务器启动成功")
})
response.end()里面只能是字符串或二进制,上述代码中的对象,转成字符串才可以。
6. node中的js–核心模块
Node为js提供了很多服务器级别的API,这些API绝大多数都被包装到了一个具名的核心模块中了,例如文件操作的fs
核心模块,http服务构建的http模块,path
路径操作模块,os
操作系统信息模块等等
var fs=require('fs')//require方法引用fs这个核心模块
var os=require('os')//用来获取机器信息
var path=require('path')//用来操作路径
console.log(path.extname('c:a/b/c/d/e/f/hello.txt'))//读出文件后缀名
7. node中的js–模块系统
浏览器中我们可以在html里引入多个js文件,但是在node里面,我们似乎只执行了一个js文件。
接下来,我们在同一个文件夹下新建两个js文件,分别为a.js和b.js
a.js中的代码
require是一个方法
它的作用就是用来加载模块的,在node中,模块有三种:
- 具名的核心模块,比如“fs”,“http”
- 用户自己编写的文件模块(本节重点讲)
- 第三方的模块
console.log('a start')
require ('./b.js')//注意在这里,必须以“./”或“../”开头
require ('./b.js')//后缀.js可以省略
console.log('a end')
b.js中的代码
console.log('b文件被加载执行了')
// require('./c.js')
//我们也可以在这里继续调用c.js
在node中没有全局作用域,只有模块作用域
在a.js
中声明的变量variable,到b文件中仍然可以声明,二者不冲突,不覆盖
在a里面写的函数,在b中也不可以被调用
外部访问不到内部,内部也访问不到外部
为什么”./"不可以省略呢?
既然是模块作用域,默认都是封闭的,那如何让模块之间进行通信呢?
有时候,我们加载文件模块的目的不是为了简单的执行里面的代码,更重要的是为了使用里面的某个成员
新建a.js,b.js
a.js
// require方法有两个作用:
// 加载文件模块并执行里面的代码
// 拿到被家长文件模块导出的接口对象
// 在每个文件模块中都提供了一个对象exports,它默认是一个空对象
// 我们要做的是把所有需要被外部访问的成员挂载到exports中
var bExports=require('./b')
console.log(bExports.foo)
console.log(bExports.add(1,2))//调用b中的函数
b.js
var foo='bbb'
exports.foo='hello'//把字符串挂到exports这个空对象中
exports.add=function (x,y) {
return x+y
}
// 把函数挂载到exports这个空对象中
7. ip地址和端口号的概念
所有联网的程序都需要联网通信
计算机只有一个物理网卡,而且局域网中网卡的地址是唯一的
网卡必须是通过唯一的ip地址来进行定位
ip定位到计算机,而端口号定位到该计算机上的那个程序
发给大家我的ip地址,和端口号,查看访问我的用户的ip和port
var http=require('http');
var server=http.createServer();
server.on('request',function(request,response){
console.log(request.socket.remoteAddress,request.socket.remotePort)
})
server.listen(3000,function(){
console.log("服务器启动成功")
})
8. 端口号补充
- ip是用来定位计算机
- 端口号是用来定位具体的应用程序
- 一切需要联网通信的软件都会占用一个端口号
- 端口号的范围从0~65535
- 在计算机中有写默认端口号,最好不要去使用
- 比如http服务的80。我们的网站上线部署的时候才使用80
- 我们在开发过程中使用一些简单好记的比如3000,5000,8888等
- 可以同时开启多个服务,但是一定要确保不同服务占用的端口号不一致
- 在一台计算机中,同一个端口号在同一时间只能被同一个程序占用
9.响应式内容类型
解决乱码问题
var http=require('http');
var server=http.createServer();
server.on('request',function(request,response){
response.end('你好,node')
})
server.listen(3000,function(){
console.log("服务器启动成功了,可以通过http:127.0.0.1:3000来进行访问")
})
结果:
服务器默认发送的数据,其实是utf-8编码的内容,但是浏览器不知道,浏览器在不知道服务器响应内容编码格式的情况下,会按照当前操作系统的默认编码格式去解析中文操作系统默认是gbk
解决办法——告诉浏览器我给你发送的内容是什么编码的:
var http=require('http');
var server=http.createServer();
server.on('request',function(request,response){
response.setHeader('Content-Type','text/plain;charset=utf-8')
response.end('你好,node')
})
server.listen(3000,function(){
console.log("服务器启动成功了,可以通过http:127.0.0.1:3000来进行访问")
})
结果:
在http协议中,就是告知浏览器我给你发送的数据内容是什么类型
var http=require('http');
var server=http.createServer();
server.on('request',function(request,response){
var url=request.url
if (url==='/plain') {
response.setHeader('Content-Type','text/plain;charset=utf-8')
response.end('<p>hello,世界</p>')
}else if (url==='/html') {
response.setHeader('Content-Type','text/html;charset=utf-8')
response.end('<p>hello,世界</p>')
}
})
server.listen(3000,function(){
console.log("服务器启动成功了,可以通过http:127.0.0.1:3000来进行访问")
})
根据不同的类型,浏览器作不同的解读
text/plain是普通文本
text/html是html格式内容
10. 发送文件中的数据一级Content-type内容类型
html文件怎么发送
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('./index.html',function (error,data) {
if (error) {
res.setHeader('Content-Type','text/plain;charset=utf-8')
res.end('文件读取失败')
}else{
res.setHeader('Content-Type','text/html;charset=utf-8')
res.end(data)
}
})
}
})
server.listen(3000,function(){
console.log("server is running……")
})