路径问题
node 中使用相对路径会存在一定的问题:相对路径不是相对js所在文件,而是相对命令行打开的目录。
__dirname:当前文件所在目录的绝对路径。
在node中只要涉及路径,以后都使用绝对路径。
// console.log(__dirname);
const fs = require("fs");
// E:\H5\代码\06_javascript\0729 node
// console.log(__dirname+"/exercise/a.txt");
fs.readFile(__dirname+"/exercise/a.txt","utf8",(err,data)=>{
if (err) {
console.log(err);
return;
}
console.log(data);
})
path模块
**概念:**处理和转换文件路径的方法。
导入:require(“path”)
在不同的操作系统下,路径分隔符是不同的,window 下是/ \ linux 是/
字符串拼接也不够灵活
以后的路径拼接都用path下的join方法。
extname(路径) 获取路径中文件的扩展名
basename(路径,ext) 返回路径中最后一部分
ext 可选 文件的扩展名
如果ext不为空,则返回的是路径中的文件名,不包含扩展名
const fs = require("fs");
const path = require("path")
// fs.readFile(__dirname+"./exercise/a.txt","utf8",(err,data)=>{
// fs.readFile(path.join(__dirname,"exercise/a.txt"),"utf8",(err,data)=>{
// if (err) {
// console.log(err);
// return;
// }
// console.log(data);
// })
// console.log(path.extname("E:\\H5\\代码\\06_javascript\\0729 node\\01exercise.html"));
console.log(path.basename("E:/H5/代码/06_javascript/0729 node/"));
网络基本概念
上网本质上是获取网络上的资源。
服务器:专门用来传输数据的电脑。
IP地址:每台电脑在互联网中的地址。 一般为4位数字 0-255 127.0.0.1表示本地。
公网IP 唯一的
局域网IP 当前局域网下的IP
域名与IP的关系
域名相当于人的名字,IP相当于身份证号。 IP是没有规律的一串数字,不好记忆。所以推出了域名,域名可以自定义,方便记忆。
DNS:将域名解析为IP地址。
DNS劫持
端口:用来区分服务器电脑中提供的不同服务。
报文:在http请求和响应的过程中传递的数据块叫做报文。
报文包含要传输的数据和一些附加信息。
报文:
请求报文:请求行 请求头 请求体
响应报文:响应头,响应体
node服务器
请求行中:请求方式 和 请求路径 参数
响应: 状态码 响应内容
200 响应成功
404 资源不存在
500 服务端错误
301 重定向
ip:127.0.0.1
域名:localhost localhost这个域名会解析为当前电脑的ip。
局域网下的ip:cmd中输入ipconfig
请求:客户端给服务端发送数据
相应:服务端返回给客户端数据
在开发过程中,客户端和服务端可以使用同一台电脑。
服务器电脑上会安装web服务器软件,Apache等。 通过安装这些软件,可以让一台普通电脑变为服务器。
在node.js中,我们不需要这些软件,可以通过http内置模块,轻松搭建服务器。
createServer方法
createServer(参数1,参数2)
创建一个服务器实例。该方法需要一个回调函数,回调函数又有两个形参。
第一个参数表示请求信息对象,一般用req,request表示。
第二个参数表示 响应信息对象 一般用 res response表示
end方法表示将内容响应给客户端。
listen监听
listen(参数1,参数2)
服务端启动必须添加端口监听。
第一个参数:该服务的端口号
第二个参数:启动成功后的回调函数,在启动成功后会立即执行。
【注意】只要js文件发现了变化,如果想要修改生效,就需要重启服务器。
const http = require("http");
// req 请求信息对象
// res 响应信息对象
http.createServer((req,res)=>{
// 处理中文乱码
res.setHeader("Content-type","text/html;charset=utf-8");
res.end("<h1>你好,世界</h1>");
}).listen(3001,()=>{
console.log("服务器已启动!");
})
响应页面案例
const fs = require("fs");
const http = require("http");
const path = require("path");
http.createServer((req,res)=>{
fs.readFile(path.join(__dirname,"/demo/a.html"),"utf8",(err,data)=>{
if (err) {
res.end(err);
return;
}
res.end(data);
})
}).listen(3000,()=>{
console.log("服务器已启动!");
})
路由
路由:服务端会根据用户输入的不同路径和请求方式的不同,响应不同的内容。
路由组成:请求方式和请求路径 get
需求:
用户输入index或者什么也不输入 显示首页
输入login 显示登录页
输入details 显示详情页
除此之外 显示404
write:一次拼接 可以多次调用。
end 直接返回响应内容 在它之后不可以跟write和end方法了 一个请求中只能调用一次。
//const http = require("http");
//http.createServer((req, res) => {
//res.setHeader("Content-type", "text/html;charset=utf-8;")
//const url = req.url;
//res.write("这是write方法1\n") //追加
// res.write("这是write方法2\n")
// if (url == "/login") {
// res.end("这是登录页");
// } else if (url == "/details") {
res.end("这是详情页")
//} else if (url == "/" || url == "/index") {
// res.end("这是首页")
// } else {
//res.end("页面被小狗叼走了!");
//}
// // res.end("hello") 不能再写,报错
//}).listen(3000, () => {
//console.log("server is running");
//})
const http = require("http") //协议模块
const fs = require("fs") //文件模块
const path = require("path") //路径模块
//搭建服务器 请求,响应
http.createServer((req, res) => {
//解决中文乱码
res.setHeader("Content-type", "text/html;charset=utf-8;")
const url = req.url;
//文件路径
let fpath = path.join(__dirname, "./demo", url);
//读取文件
fs.readFile(fpath, "utf8", (err, data) => {
if (err) {
res.end("<h1>页面加载异常</h1>")
} else {
res.end(data);
}
})
}).listen(3000, () => {
console.log("服务器已启动!");
})