Nodejs_01

Node.js 是什么

  • Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine.
    • Node.js是一个JavaScript 运行环境,简单点来讲就是Node.js可以解析和执行JavaScipt代码
    • 以前只有浏览器尅解析执行Javascript代码,现在可以完全脱离浏览器来运行
  • 浏览器中的JavaScript
    • EcmaScript
    • BOM
    • DOM
  • Node.js中的JavaScript没有DOM和BOM
  • 在node这个JavaScript执行环境中为JavaScript提供了一些服务器级别的操作API
    • 例如文件读写
    • 网络服务器的构建
    • 网络通信
    • http服务器
  • Node.js uses an event driven, non-blocking I/O mdel that makes it lightweight and efficient
  • Node.js’ package ecosystem, npm, is the largest ecosystem of open source libraries in the world
    • 绝大多数JavaScript相关的包都存放在npm上,这样做的目的是为了让开发人员更方便地去下载使用
    • npm install jquery
  • 核心模块
    • Node为JavaScript提供了很多服务器级别的API,这些API绝大多数都被包装到了一个具名的模块中了, 例如文件操作的fs核心模块,http服务构建的http模块,path路径操作模块,os操作系统信息模块

一旦是模块,就一定要require()

var fs = require('fs')
var os = require('os')

Node.js能做什么

  • Web服务器后台
  • 命令行工具
    • npm
    • git
    • hexo
  • 游戏服务器
  • 接口服务器

这门课你能学到什么

  • B/S编程模型
    • browser - Server
  • 模块化编程
    • requireJS
    • SeaJs
    • @import('文件路径')
    • 以前认知的JavaScript只能通过script标签来加载

Hello world

用sublim编写,然后terminal输入 node name.js
命名的时候不可以用node为名字
浏览器中的js没有文件读写的能力,但是node中的js具有文件读写的能力
在node中如果想要进行文件操作,就必须引用fs这个核心模块, 在fs这个核心模块中,就提供了所有的文件操作相关的API

  1. 使用require方法加载fs核心模块
var fs = require('fs')
var os = require('os')
//获取当前机器的cpu信息
console.log(os.cpus())
//获取内存大小
console.log(os.totalmem)
//获取操作路径的
var path = require('path')
path.extname('c:/a/b/c/d/hello.txt')

在terminal中返回的信息
在这里插入图片描述

  • 简单的模块化编程
    怎么做到同时运行两个文件,可以编写一个js文件作为模块作为自定义模块,然后在另一个js文件内require自定义模块
    • b.js
var foo = 'bbb'
console.log('b.js文件被加载执行了')
  • a.js
//在node中,模块有三种,
//1.具名的核心模块,例如fs、http
//2.永华自己编写的文件模块
//在node中没有全局作用域,只有模块作用域
var foo = 'aaa'
console.log('a.start')
require('./b.js')
console.log('a.end')
console.log('foo的值是:',foo)

terminal显示为
在这里插入图片描述

  • 加载与导出
//require方法有两个作用
//1.加载文件模块并执行里面的代码
//2.拿到被加载文件模块导出的接口对象
//
//在每个文件模块中都提供了一个对象: export
//export默认是一个空对象
//你要做的就是把所有需要外部访问的成员挂载到这个export的对象中
var ret = require('./b')
console.log(ret.foo)
console.log(ret.add(10,30))
var foo = 'bbb'
console.log(exports)
exports.foo = 'hello'
//这个是exports对象里面的函数
exports.add = function(x,y){
return x + y
}
//这个就是模块内自己的函数,无法被其他模块调用
function add(x,y){
return x - y
}
  1. 读取文件
    第一个参数就是读取的文件路径
    第二个参数是一个回调函数
  • error
    如果读取失败,error就是一个错误对象
    如果读取成功,error就是null
  • data
    如果读取成功,data就是读取到的数据
    如果读取失败,data就是undefined
fs.readFile('./data/hello.txt',function (error,data){
//默认文件中存储的都是二进制数据,打印的时候由二进制转为了十六进制
//可以通过tostring方法转为人类可识别文字

if (error){
console.log('读取文件失败')
return
}
console.log(data.toString())
})

写文件和简单的错误处理

第一个参数:文件路径
第二个参数:文件内容
第三个参数:回调函数
error

  • 成功: 文件写入成功 error是null
  • 失败: 文件写入失败,error就是错误对象
var fs = require('fs')

$.ajax({
.....
success: function(data){
}
})

fs.writeFile('./data/你好.md','大家好给大家介绍一下,我是node.js',function(error){
console.log('文件写入成功')
})

简单的http服务

http 这个模块的职责就是帮你创建编写服务器的

var http = require('http')
var server = http.createServer()
//服务器是拿来干什么的
//发送请求
//接受请求
//处理请求
//给个反馈(发送响应)
//注册request 请求事件,当客户端请求过来,就会自动触发服务器的request请求时间,然后执行第二个参数,回调处理
server.on ('request',function(){
	console.log('收到客户端的请求了')
})
//绑定端口号,启动服务器
server.listen(3000,function(){
	console.log('服务器启动成功了,可以通过http://127.0.0.1:3000/ 来启动')
})

用上面的代码运行,网页会空转,因为代码只是让服务器收到请求,服务器没有处理也没有反馈,网页等待服务器响应
在这里插入图片描述
** 如何关闭服务器 control + c

response

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/ 来启动')
})

运行上面的代码,terminal中的显示为

网页上的显示为在这里插入图片描述
如果更改网页上的url(例如加一个/a),terminal里面的返回值也会相对应地变化(例如变成"请求路径是:/a")

var http = require('http')
var server = http.createServer()
//request 请求事件处理函数,需要接收两个参数:
// request 请求对象
// 请求对象可以用力啊获取客户端的一些请求信息,例如请求路径
//response响应对象
// 响应对象可以用来给客户端发送响应消息
server.on ('request',function(request,response){
	console.log('收到客户端的请求了,请求路径是: '+request.url)
	//response对象有一个方法:write可以用来给客户端发送响应数据
//write可以使用多次,但是最后一定要使用end来结束响应,否则客户端会一直等待
response.write('hello')
response.write(' nodejs')
response.end()
})
//绑定端口号,启动服务器
server.listen(3000,function(){
	console.log('服务器启动成功了,可以通过http://127.0.0.1:3000/ 来启动')
})

代码更改过之后一定要重启才生效
在生效之后,无论你在网页的url里面加什么,输出都是hello nodejs
我们希望当请求不同的路径的时候响应不懂的结果,默认是/
例如当请求是 /login 响应登录,请求是/register 响应注册

根据不同路径返回不同数据

var http = require('http')
var server = http.createServer()
server.on ('request',function(request,response){
	console.log('收到客户端的请求了,请求路径是: '+request.url)
//response.end('hello nodejs')
//可以不用write,直接用end,表示发送响应数据并停止响应
//根据不同的请求数据发送不同的响应效果
if (request.url === '/'){
response.end('index page')
}else if (request.url === '/login'){
response.end('login page')
}else if (request.url === '/products'){
//响应内容只能是二进制数据或者字符串
//但是可以用Json 转换
var products = [
{
name: '苹果x',
price: 8888
},
{
name: '菠萝x',
price: 5000
},
{
name: '小辣椒x',
price: 1999
}
]
response.end(JSON.stringify(products))
}
else{
response.end('404 not found')
}
})
//绑定端口号,启动服务器
server.listen(3000,function(){
//这里的3000,只要端口没有被占用,什么数字都可以,80比较特殊,当设置是80的时候,进入网页不需要输入端口号
	console.log('服务器启动成功了,可以通过http://127.0.0.1:3000/ 来启动')
})

用以上代码进入products界面
在这里插入图片描述

ip地址和端口号的概念

ip地址用来定位计算机
端口号用来定位具体的应用程序(所有需要联网通信的软件必须拥有端口号)
可以在别的电脑上用ip地址访问网页
http://192.168.3.5:3000/

console.log('请求我的客户端的地址和端口是:',request.socket.remoteAddress,request.socket.remotePort)
//node会自己找到请求的客户端的地址和端口号
  • 端口号的范围在0-65536
  • 可以同时开启多个服务,但是要保证不同服务的端口号不同(开多个terminal)
  • 关于中文乱码的问题
var http = require('http')
var server = http.createServer()
server.on('request',function(req,res){
//在服务器端默认发送的数据,其实是utf8编码的内容
//但是会默认按照当前操作系统的默认编码去解析,中文操作系统默认是gbk
//在http协议中,Content-Tyoe就是用来告知对方我给你发送的数据内容是什么类型
res.setHeader('Content-Type','text/plain;charset=utf-8')
res.end('Hello 世界')
//charset=utf-8之间不能有空格
if (url === '/plain'){
res.setHeader('Content-Type','text/plain;charset=utf-8')
res.end('hello 世界')
}else if (url === '/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')
})

content type总结

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset = "UTF-8">
	<title>Document</title>
</head>
<body>
	<h1>首页</h1>
<body>
</html>
var http = require('http')
var fs = require('fs')
var server = http.createServer()
server.on('request',function(req,res){
	console.log('收到客户端的请求了,请求的路径是:'+req.url)
//index.html
var url = req.url
if (url === '/'){
fs.readFile('/Users/chenyaqian/Desktop/nodejs/01/source/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('Content-Type','text/html;charset=utf-8')
res.end(data)
}
})
}else if (url === '/desktop.jpg'){
fs.readFile('/Users/chenyaqian/Desktop/nodejs/01/source/WechatIMG1.jpeg',function(err,data){
if (err){
res.setHeader('Content-Type','text/plain;charset=utf-8')
res.end('文件读取失败,请稍后重试!')
}else{
//data 默认是二进制数据,可以通过,toString转为字符串
//res.end()支持字符串和二进制
res.setHeader('Content-Type','image/jpeg')
res.end(data)
}
})
}
})
server.listen(3000,function(){
	console.log('服务器启动成功了,可以通过http://127.0.0.1:3000/ 来启动')
})

Content-Type

https://tool.oschina.net/commons

发布了6 篇原创文章 · 获赞 0 · 访问量 109

猜你喜欢

转载自blog.csdn.net/vanlish/article/details/104074957
01
#01