1.fs模块
在node中采用EsmaScript进行编码,没有Bom与Dom,和浏览器中的JS不一样。
浏览器中的js没有文件操作能力,但是Node中的js可以对文件进行操作。
fs是file-system的简写,就是文字系统。在Node中使用这个核心模块就需要引入。
1.读文件
Node是错误优先的回调函数
第一个参数返回错误,并且验证它是否出错;其他参数返回数据。
第一个参数就是要读取的文件路径,第二个为编码类型,一般直接填写utf-8即可,否则读取的文件是乱码,第三个参数是一个回调函数。
2.写文件
第一个参数就是要读取的文件路径,第二个为编写的内容,第三个参数是一个回调函数。
fs.writeFile('red2.txt', '这里写文大家好,我是xxx!', (err) => {
if (err) {
console.log('Error you file');
} else {
console.log('Success');
}
});
3.封装写法
1.直接封装
const fileMethod= {
readFile: (path, cb) => {
fs.readFile(path, 'utf8', (err, data) => {
if (!err) {
cb(data)
}
})
},
writeFile: (path, content, cb) => {
fs.writeFile(path, content, 'utf8', (err) => {
if (!err) {
cb()
}
})
},
}
var pathUrl = './modb/studen.json'
//readFile调用
fileMethod.readFile(pathUrl, (data) => {})
//WriteFile调用
fileMethod.writeFile(pathUrl, JSON.stringify(DataObj), () => {
console.log('写入成功')
})
2.promise封装
//pathUrl为路径
function readFiles(pathUrl) {
return new Promise((resolve) => {
fs.readFile(pathUrl, 'utf-8', (err, data) => {
if (!err) resolve(data)
})
})
}
//pathUrl为路径,attr为保存的信息
function writeFiles(pathUrl, attr) {
return new Promise((resolve) => {
fs.writeFile(pathUrl, attr, 'utf-8', (err, data) => {
if (!err) resolve(data)
})
})
}
//readFile调用
var pathUrl = './modb/studen.json'
readFiles(pathUrl).then((res) => {
console.log(res)
})
writeFiles(pathUrl, 'helloWorld22').then((res) => {
console.log(res)
})
2.http创建简单服务器
Node中专门提供了一个核心模块http,可以使用这个模块来创建一个web服务器。
response.write可以使用多次,但是最后一定要使用end来结束响应,否则会一直的等待。
var http = require('http'); //1 加载HTTP模块
var serve = http.createServer(); //2 创建serve实例
//3 发起请求
serve.on('request', (request, response) => {
response.write('Seccess Server http://127.0.0.1:3000/')
response.end();
});
// 4 启动服务器
serve.listen(3000, function () {
console.log('服务器启动成功!,访问http://127.0.0.1:3000,查看');
});
启动指令:
node https.js
根据不同请求路径返回不同数据
response.end(); 是能传递string或者Buffer类型
serve.on('request', (request, response) => {
console.log('输出收到服务器请求地址', request.url);
if (request.url.includes('Login')) {
response.write('Is Login');
} else if (request.url.includes('zhuce')) {
response.write('Is register');
} else {
response.write('404 Not Found');
}
response.end(request.url);
});
Ip和端口号的概念
Ip定位计算机
console.log('获取地址', req.socket.remoteAddress);
端口号定位应用程序
console.log('获取端口', req.socket.remotePort);
计算机一些默认端口号,最后不要使用。
开发中,使用一些简单的就可以了,例如:3000,5000,8080·····
设置utf-8编码解决乱码
解决:
需要设置响应内容类型(设置请求头)
res.setHeader(‘content-type’, ‘application/json; charset=utf-8’);
· Content-Type内容类型发送文件中的数据类型数据
常见的媒体格式类型如下:
text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式
· 以application开头的媒体格式类型:
application/xhtml+xml :XHTML格式
application/xml: XML数据格式
application/atom+xml :Atom XML聚合格式
application/json: JSON数据格式
application/pdf:pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
服务器链式写法
var http = require('http');
http.createServer((req, res) => {
res.end('close');
}).listen(80, () => {
console.log('serve is success.please visit location adress http://127.0.0.1');
});
模板语法
1.安装
npm install art-template --save
- 在node中引入
var templates = require('art-template');
3.读取
fs.readFile('./assest/index.html', (err, data) => {
if (err) {
res.end('is 404');
}
var htmlStr = templates.render(data.toString(), {
msg: '这是一条数据'
});
res.end(htmlStr);
});
4.在html页面输出
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
</head>
<body>
<h1>node读取index成功</h1>
<p>{{msg}}</p>
{{each msg}}
<div class="box">
<h1>{{$value.name}} :</h1>
<h2>{{$value.say}}</h2>
</div>
{{/each}}
</body>
</html>
3.url模板
直接在node中使用require引入。
var url = require('url');
Url里面的方法有如下:
{
Url: [Function: Url],
parse: [Function: urlParse],
resolve: [Function: urlResolve],
resolveObject: [Function: urlResolveObject],
format: [Function: urlFormat],
URL: [class URL],
URLSearchParams: [class URLSearchParams],
domainToASCII: [Function: domainToASCII],
domainToUnicode: [Function: domainToUnicode],
pathToFileURL: [Function: pathToFileURL],
fileURLToPath: [Function: fileURLToPath]
}
通过parse方法能获得到pathname路径以及query参数
url.parse(req.url, true);
url.parse('/sendMsg?a=1&b=2',true)
Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: '?a=1&b=2',
query: 'a=1&b=2',
pathname: '/getmsg',
path: '/getmsg?a=1&b=2',
href: '/getmsg?a=1&b=2'
}
通过JSON.stringify()吧json数据转为字符串格式,并显示在页面上。
if (pathName === '/sendMsg') {
res.end(JSON.stringify(parseObj.query));
}
4.文档的引入和抛出
1.exports
使用require引入文件,在另一个js文件中使用exports抛出。
注:exports只能单个抛出。
a.js
var b = require('./b');
console.log(b);
b.js
var str = 'This is b str';
var str_no2 = 'This is b str_no2';
exports.str = str;
exports.str_no2 = str_no2;
输出返回一个对象
2.module.exports
使用require引入文件,在另一个js文件中使用module.exports抛出。
注:module.exports可以多个一起抛出。
a.js
var b = require('./b');
console.log(b);
b.js
var str = 'This is b str';
var str2 = 'This is b str2';
module.exports = { str, str2 };
5.Express框架
原生的 http在某些方面表现不足以应对我们的开发需求,所以我们就需要使用框架来加快我们的开发效率,框架的目的就是提高效率,让我们的代码更高度统一。
下载
在文件中输入 npm init -y(这样可以跳过向导直接生产) ,文档中会多出来一个package.json的文件,用来存放自己下载安装过的包。
然后打开命令提示块输入
npm intsall express --save
下载框架
基本使用
直接引入express,发送请求只需要后面加上get/post即可。
var express = require('express');
var app = express();
app.get('/', (req, res) => {
res.send('hello express');
});
app.get('/getMsg', (req, res) => {
arr = [
{ name: '哈哈', age: 18 },
{ name: '嘻嘻', age: 20 }
];
res.send(arr);
});
app.listen(3000, () => {
console.log('http://127.0.0.1');
});
request 和 response 对象的具体介绍:
Request 对象 - request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性。常见属性有:
1.req.app:当callback为外部文件时,用req.app访问express的实例
2.req.baseUrl:获取路由当前安装的URL路径
3.req.body / req.cookies:获得「请求主体」/ Cookies
4.req.fresh / req.stale:判断请求是否还「新鲜」
5.req.hostname / req.ip:获取主机名和IP地址
6.req.originalUrl:获取原始请求URL
7.req.params:获取路由的parameters
8.req.path:获取请求路径
9.req.protocol:获取协议类型
10.req.query:获取URL的查询参数串
11.req.route:获取当前匹配的路由
12.req.subdomains:获取子域名
13.req.accepts():检查可接受的请求的文档类型
14.req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages:返回指定字符集的第一个可接受字符编码
15.req.get():获取指定的HTTP请求头
16.req.is():判断请求头Content-Type的MIME类型
Response 对象 - response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据。常见属性有:
1.res.app:同req.app一样
2.res.append():追加指定HTTP头
3.res.set()在res.append()后将重置之前设置的头
4.res.cookie(name,value [,option]):设置Cookie
5.opition: domain / expires / httpOnly / maxAge / path / secure / signed
6.res.clearCookie():清除Cookie
7.res.download():传送指定路径的文件
8.res.get():返回指定的HTTP头
9.res.json():传送JSON响应
10.res.jsonp():传送JSONP响应
11.res.location():只设置响应的Location HTTP头,不设置状态码或者close response
12.res.redirect():设置响应的Location HTTP头,并且设置状态码302
13.res.render(view,[locals],callback):渲染一个view,同时向callback传递渲染后的字符串,如果在渲染过程中有错误发生next(err)将会被自动调用。callback将会被传入一个可能发生的错误以及渲染后的页面,这样就不会自动输出了。
14.res.send():传送HTTP响应
15.res.sendFile(path [,options] [,fn]):传送指定路径的文件 -会自动根据文件extension设定Content-Type
16.res.set():设置HTTP头,传入object可以一次设置多个头
17.res.status():设置HTTP状态码
18.res.type():设置Content-Type的MIME类型
利用 Express 托管静态文件
Express 提供了内置的中间件 express.static 来设置静态文件如:图片, CSS, JavaScript 等。
你可以使用 express.static 中间件来设置静态文件路径。例如,如果你将图片, CSS, JavaScript 文件放在 public 目录下,你可以这么写:
1.引入静态文件目录
app.use(express.static('./pubilc/'));
2.目录结构如下图
3.在浏览器输入,即可访问到
http://127.0.0.1/css/a.css
修改完代码自动重启服务器
nodemon是基于Node开发的第三方命名航工具,能解决频繁修改代码重启服务器问题
下载方法(直接在全局安装即可):
npm install --golbal nodemon
npm i -g nodemon
安装完之后:
nodemon app.js
验证是否安装成功:
nodemon --version
nodemon -v
重定向问题
原来不使用框架重定向需要这么写:
res.statusCode = 302;
res.setHeader('Location', '/');
现在使用express框架只需一步即可:
res.redicect('/');
Get/post请求获取参数
1.get请求获取参数
app.get(’/get, (req, res) => {
res.send(res.query);
});
2.post请求获得参数
Express没有内置获取post请求参数的api需要下载一个包:bode-parser
安装
npm install --save body-parser
在app.js中引入并且配置
var bodyParser = require('body-parser')
//配置body-parser插件(解析post请求参数)
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))
//然后调用即可req下面的body即可
app.post('/getPost', (req, res) => {
res.setHeader('Access-Control-Allow-Origin', '*') //跨域
console.log(req.body)
res.send(req.body)
})
打印输出可以看的里面包含传过来的参数
6.express模板语法的基本使用
下载插件
npm install --save express-art-template
文件目录
页面统一放在views文件夹下面,没有就建一个。
views为页面的默认目录。
修改目录路径
app.set("view",文件路径)
引入插件
const express = require('express');
const app = express();
app.engine('html', require('express-art-template'));
const port = 80;
app.get('/', (req, res) => {
res.render('404.html', {
title: '你访问的页面已丢失404~'
});
});
app.listen(port, () => console.log(`http://127.0.0.1`));
在页面中使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
</head>
<body>
<div>{{title}}</div>
</body>
</html>