如果我们使用 PHP 来编写后端的代码时,需要 Apache 或者 Nginx 的 HTTP 服务器,并配上 mod_php5 模块和 php-cgi。 从这个角度看,整个”接收 HTTP 请求并提供 Web 页面”的需求就不需要 PHP 来处理。 不过对 Node.js 来说,概念完全不一样了。使用 Node.js 时,我们不仅仅 在实现一个应用,同时还实现了整个 HTTP 服务器。事实上,我们的 Web 应用以及对应的 Web 服务器基本上是一样的。 在我们创建 Node.js 第一个 “Hello, World!” 应用前,让我们先了解下 Node.js 应用是由哪几部分组成的:
- 引入 required 模块:我们可以使用 require 指令来载入 Node.js 模块。
- 创建服务器:服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。
- 接收请求与响应请求 服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据
创建 Node.js 应用
一、引入http 模块
我们使用 require 指令来载入 http 模块,并将实例化的 HTTP 赋值给变量 http,实例如下:
var http = require("http")
二、创建服务器
接下来我们使用 http.createServer() 方法创建服务器,并使用 listen 方法绑定 8888 端口。 函数通过 request, response 参数来接收和响应数据。
实例如下,在你项目的根目录下创建一个叫 server.js 的文件,并写入以下代码:
var http = require("http")
http.createServer(function (request, response) {
response.writeHead(200, { "Content-Type": "text/plain" }) // 发送HTTP头部, HTTP状态值:200 内容类型:text/plain
response.end("Hello World\n") // 发送响应数据 "Hello World"
}).listen(8888)
console.log("Server running at http://127.0.0.1:8888/")
以上代码我们完成了一个可以工作的 HTTP 服务器
使用 node 命令执行以上的代码:
node server.js
Server running at http://127.0.0.1:8888/
接下来我们通过 Gif 图为大家演示实例操作:
实现一个静态http服务器
const http = require("http");
const fs = require("fs")
http.createServer(function (req, res) {
// 打开 www/ 目录下的文件
fs.readFile("./www/" + req.url, function (err, data) {
if (err) {
console.log(err);
res.write("404");
res.end();
} else {
console.log(data.toString())
res.write(data);
res.end();
}
})
}).listen(8080)
const http = require("http");
const fs = require("fs");
const querystring = require("querystring");
/*
*1. 访问www内的静态资源
*2. 解析get请求, 并保存到serverLog.txt
*3. 解析post请求serverLog.txt
*/
// 获取当前时间
function getNowDate() {
let dt = new Date();
let year = dt.getFullYear();
let month = dt.getMonth();
let day = dt.getDate();
// 将月份加1
month = month + 1;
// 将月份补齐到两位
if (month <= 9) {
month = "0" + month;
}
// 将日补齐到两位
if (day <= 9) {
day = "0" + day;
}
let hour = dt.getHours();
let minutes = dt.getMinutes();
let seconds = dt.getSeconds();
return year + "-" + month + "-" + day + "-" + hour + "-" + minutes + "-" + seconds;
}
http.createServer(function (req, res) {
// 1. 尝试访问www下的静态资源
fs.readFile("./www" + req.url, function (err, data) {
if (err) {
//2. 解析请求的参数, 并保存到log
if (req.method === "GET") {
console.log("收到了GET请求")
let getData = querystring.parse(req.url.split("?")[1]);
console.log("获得的get数据为==>", getData);
fs.writeFile("./serverLog.txt", getNowDate() + "\n" + JSON.stringify(getData) + "\n", { flag: 'a' }, function (err) {
if (err) {
console.log(err);
console.log("GET数据保存至log出错");
}
});
} else if (req.method == "POST") {
console.log("收到了POST请求")
let tmpData = ''
req.on("data", function (data) {
tmpData += data;
});
req.on("end", function () {
let postData = querystring.parse(tmpData);
console.log("获得的post数据为==>", postData);
fs.writeFile("./serverLog.txt", getNowDate() + "\n" + JSON.stringify(postData) + "\n", { flag: 'a' }, function (err) {
if (err) {
console.log(err);
console.log("POST数据保存至log出错");
}
});
})
}
res.write("404");
res.end();
} else {
res.write(data);
res.end();
}
})
}).listen(8000)
var http = require("http")
var fs = require("fs")
var path = require("path")
//创建服务
http.createServer(function (req, res) {
var html = fs.readFileSync(path.join(__dirname, "/main.html"))
// res.writeHead(200, {'Content-Type': 'text/plain'}) //普通文本
res.writeHead(200, { "Content-Type": "text/html" }) //html文本
// res.setHeader("Content-Type", "text/html")
// res.setHeader("Set-Cookie", ["type=ninja", "language=javascript"])
res.write(html)
res.end()
}).listen("7890", function (err) {
if (err) {
console.log(err)
throw err
}
console.log("服务器已开启。端口号为:7890")
})
console.log("Server running at http://127.0.0.1:7890/")
var http = require("http")
var fs = require("fs")
var url = require("url")
http.createServer(function (req, res) {
var hostname = req.headers.host //获取requset信息中的host地址
var pathname = url.parse(req.url).pathname //获取pathname
if (pathname === "/") {
//判断是否为域名地址(简单路由)
readFileAndResponse("/index.html", res)
}
}).listen(7890)
function readFileAndResponse(pathname, response) {
fs.readFile(pathname.substr(1), "", function (err, data) {
if (err) {
//文件不存在或读取错误返回404,并打印page not found
response.writeHead(404)
response.end("page not found")
} else {
response.end(data) //读取成功返回相应页面信息
}
})
}
console.log("Server running at http://127.0.0.1:7890/")
var https = require('https')
var option = {
hostname: 'm.baidu.com',
path: '/tcx?appui=alaxs&page=api/chapterList&gid=4315647048&pageNum=1&chapter_order=asc&site=&saveContent=1',
headers: {
'Accept': '*/*',
'Accept-Encoding': 'utf-8', //这里设置返回的编码方式 设置其他的会是乱码
'Accept-Language': 'zh-CN,zhq=0.8',
'Connection': 'keep-alive',
'Cookie': 'BAIDUID=A78C39414751FF9349AAFB0FDA505058:FG=1 true __bsi=12248088537049104479_00_7_N_R_33_0303_cca8_Y',
'Host': 'm.baidu.com',
'Referer': 'https://m.baidu.com/tcx?appui=alaxs&page=detail&gid=4305265392&from=dushu'
}
}
https.get(option, function (res) {
var chunks = []
res.on('data', function (chunk) {
chunks.push(chunk)
})
res.on('end', function () {
console.log(Buffer.concat(chunks).toString())
})
})
fs模块读写文件
const fs = require("fs");
// 写入文件
fs.writeFile("HelloWorld.txt", "HelloWorld HelloNode", function (err) {
if (err) {
console.log(err);
}
// 读取刚刚写入的数据
else {
fs.readFile("HelloWorld.txt", function (err, data) {
if (err) {
console.log(err);
} else {
console.log(data.toString());
}
})
}
})