readFile 和 writeFile
这是node.js
提供的一个的模板里的函数。使用前要先引入模板
var fs = require("fs")
// require 用来引入所需模板
readFile 读取文件
readFile
方法是将要读取的文件内容完整读入缓存区,再从该缓存区中读取文件内容,
这是同步方法,
格式:
var fs = require("fs")
fs.readFile('aa.json','utf8',(err,data)=>{
if(err){
return err
}
console.log(data)
})
对应的有一个异步方法readFileSync
,都是读取文件
var fs = require("fs")
var text = fs.readFileSync('aa.json','utf8',)
console.log(text)
writeFile 写入文件
writeFile
方法是将要写入的文件内容完整的读入缓存区,然后一次性的将缓存区中的内容写入都文件中,设置同步方法。
var fs = require("fs")
var str = 'sadsavxzawsdncxklzcSDaskdln撒旦'
fs.writeFile('a.text',str, (err)=>{
if(err){
console.log('写入失败')
}else{
console.log('写入成功')
}
})
对应的有一个异步方法writeFileSync
,都是写入文件
ar fs = require("fs")
var str = 'sadsavxzawsdncxklzcSDaskdln撒旦'
fs.writeFileSync('a.text',str)
文件追加内容
// 如果文件不存在则创建 , 文件存在则追加内容
fs.appendFile(url, content, () => {
// url 文件的地址
// content 追加的文件内容
// callback 回调函数 写入失败的信息
})
删除文件
fs.unlink(url, () => {
// url 文件的地址
// callback 回调函数 删除失败的信息
})
文件重命名
fs.rename(oldUrl, newName, () => {
// oldUrl 原文本的地址 源文件名字
// newName 重新命名文件名 新名字
// callback 回调函数 命名失败的信息
})
服务器基础
网站的组成
网站应用程序主要分为两大部分:客户端和服务器端。
客户端:在浏览器中运行的部分,就是用户看到并与之交互的界面程序。使用HTML、CSS、JavaScript构建。
服务器端:在服务器中运行的部分,负责存储数据和处理应用逻辑
网站服务器
能够提供网站访问服务的机器就是网站服务器,能够接收客户端的请求,能够对请求做出响应,可以简单的理解为一台电脑,以前放服务器的叫机房,现在都叫数据中心
IP地址
IP 地址是互联网中各个设备的唯一标识。
IP是Internet Protocol Address的简写,代表互联网协议地址.
域名
尽管IP地址能够唯一地标记网络上的计算机,但IP地址是一长串数字,不直观,而且用户记忆十分不方便,于是人们又发明了另一套字符型的地址方案,即所谓的域名地址。IP地址和域名是一一对应的,这份域名地址的信息存放在一个叫域名服务器(DNS,Domain name server)的主机内,使用者只需了解易记的域名地址,其对应转换工作就留给了域名服务器。域名服务器就是提供IP地址和域名之间的转换服务的服务器。
端口
端口是计算机与外界通讯交流的出口,用来区分服务器电脑中提供的不同的服务
因为服务器上的运行的软件太多,端口可以让各个软件正常运行互不影响。
url
URL 格式:传输协议://服务器IP或域名:端口/资源所在位置标识
创建wed服务器
使用 nodejs 语言编写创建服务器
// 引入http模块
const http = require('http')
// 创建一个http服务
var app = http.createServer()
/*为app对象注册 `request` 事件,当客户端有请求到达服务器后,会触发这个事件执行回调函数中有两个参数
req:表示客户端的请求信息,可以从中获取客户端的信息
res:表示服务端的相应,可以使用此对象向客户端发送信息
*/
app.on('request', (req, res) => {
// 服务器必须向客户端发送响应信息,否则客户端就会一直等待
res.end('ok')
})
// 开启服务器端口3000
app.listen(3000, () => {
console.log('Server is running at http://127.0.0.1:3000')
})
http
服务端对话客户端的过程:
DSN 解析,建立TCP连接,发送http请求
server接收到http请求,处理,并返回响应
客户端接收到返回数据,并处理数据,如渲染页面,执行Js
获取Post方式提交的数据
const http = require('http')
var app = http.createServer()
app.on('request', (req, res) => {
res.setHeader("content-type", "application/json")
if(req.url=="/spi/index"){
let postData = '';
req.on("data", (params) => {
postData += params;
});
req.on("end", () => {
res.end(postData)
});
}
})
// 开启服务器端口3000
app.listen(3000, () => {
console.log('Server is running at http://127.0.0.1:3000')
})
获取客户端以post方式获取的数据
为请求对象添加两个事件监听:data和end
因为post方式传递的数据两可能比较大,所以数据可能不是一次性传递过来的,每当接收到请求体中的数据,都会触发data事件3)当数据接受完毕后,就会触发 end 事件
所以,先声明一个变量,在 data事件中累加变量,在end事件中,将其解析为真正的post请求格式
引入文件(模块化)
Node.js规定一个JavaScript文件就是一个模块,每一个模块都是一个单独的作用域,模块内部定义
的变量和函数默认情况下在外部无法得到
模块内部可以使用exports对象进行成员导出, 使用require方法导入其他模块。
格式:
const nams = require("文件地址")
例:
const moban= require("../controller/blog")
文件只是引入但里面的方法、类都还不能用,需要先进行包装暴露
两个方法:exports、 module.exports
exports只能使用语法来向外暴露内部变量,module.exports既可以通过语法,也可以直接赋值一个
对象
exports
function add(a,b){
return a+b
}
exports.add=add
调用:
console.log(moban.add(6,6))
module.exports
module.exports.a=10
module.exports.b=20
module.exports.add=(a,b)=>a+b
调用:
const a_module=require('./a')
console.log(a_module.a);
console.log(a_module.b);
console.log(a_module.add(4,5));
Promise
const fs = require('fs')
// resolve 和 reject 就是两个形参,表示两个回调函数
// 成功了,调用resolve函数,失败了调用reject函数,同时传递参数
let p1 = new Promise((resolve, reject) => {
// 将异步代码写到这个函数中
fs.readFile('a.txt', 'utf8', (err, data) => {
if (err) {
reject('读取失败了')
} else {
resolve(data)
}
})
})
/*
异步任务结束后,
如果成功了,会触发then事件,我们就传递一个实参进去,这个参数是一个函数,会赋值给上面的形参 resolve
如果失败了,会触发catch事件,我们就传递一个实参进去,这个参数是一个函数,会赋值给上面的形参 reject
*/
p1.then(result => {
console.log(result)
}).catch(err => {
console.log(err)
})
class 类
class 属性定义了元素的类名。
class 属性通常用于指向样式表的类。但是,它也可以用于 JavaScript 中(通过 HTML DOM), 来修改 HTML 元素的类名。
// 匿名:
let point = class{
constructor(x,y){
this.x = x;
this.y = y;
}
toString(){
return '('+this.x+','+this.y+')'
}
}
// 命名:
class point{
constructor(x,y){
this.x = x;
this.y = y;
}
toString(){
return '('+this.x+','+this.y+')'
}
}
类的调用
var p1 = new pinot('abcs','132ws')
p1.toString();
console.log(p1.x);
类的方法
constructor 方法
constructor 方法是类的默认方法,通过 new 命令生成对象实例时,自动调用该方法(默认返回实例对象 this)。一个类必须有 constructor 方法,如果没有显式定义,一个空的 constructor 方法会被默认添加。一个类只能拥有一个名为 “constructor” 的特殊方法,如果类包含多个 constructor 的方法,则将抛出 一个 SyntaxError 。
1.在类中声明方法的时候,方法前不加 function 关键字
2.方法之间不要用逗号分隔,否则会报错
3.类的内部所有定义的方法,都是不可枚举的(non-enumerable)
4.一个类中只能拥有一个 constructor 方法
静态方法
静态方法可以通过类名调用,不能通过实例对象调用,否则会报错
class Person {
static sum(a, b) {
console.log(a + b)
}
}
var p = new Person()
Person.sum(1, 2) // 3
p.sum(1,2) //
类的继承
extends 属性用来继承类
class BaseModel {
constructor(msg, data) {
this.msg = msg;
this.data = data;
}
}
class SuccessModel extends BaseModel {
constructor(msg, data) {
// 调用父类的方法 super
super(msg, data);
this.errno = 0;
}
str(){
}
}