示例最终实现效果,如下:
好了,了解示例需求,下面我们就一起来一步一步实现上述Demo吧。
二、前端文件准备
要实现上述效果,我们首先简单地准备两个页面login.html、home.html以及一张贺岁图片,显而易见,供接下来node读取它们并将它们呈现到浏览器中,使用。
在上述说明中,已讲过node服务器是通过路由来判断,加载哪张页面,固我们将login.html中form的action写作"./home",以达到我们的目的,请求方式嘛,使用的当然是post咯。
且,因为我们要将在login.html中填写的账户名动态地与home.html结合,固home.html中的“称呼”位置,不能写死,因此我们利用{name}来占位,随后利用node动态替换。
好了,简易编写的login.html、home.html以及贺岁图,如下:
<!DOCTYPE html><head> <meta charset="utf-8"> <style> form {text-align:center; } </style></head> <body> <form action="./home" method="post">账户:<input type="text" name="name"/><br/>密码:<input type="password" name="password"/><br/><input type="submit" value="提交"/> </form></body></html>login.html
<!DOCTYPE html><head> <meta charset="utf-8"> <style> body {text-align:center; } span {color: blue; } </style></head> <body> <div><span>{name}</span>,新de一年,一定要开心哦~ </div> <img src="./getPic"/></body></html>home.html
三、编写node服务
上述中,我们所需要的前端文件已经准备完毕,接下来就是通过node来编写服务,将它们串联起来咯。
首先,我们搭建一个主文件,取名为main.js吧,作用不言而喻,主入口嘛,如果我们在代码编写完毕后,想要启动服务,就node main.js就OK咯。
如下:
"use strict";var http = require("http");var server = http.createServer();server.on("request",function(req, res){ //排除favicon.ico请求 if(req.url != "/favicon.ico"){ //TODO }else{ res.end(); }; }).listen("80");console.log("Server running!");接着,我们就一起来逐步完善这个主文件。
"use strict";var http = require("http");var url = require("url");var server = http.createServer();server.on("request",function(req, res){ if(req.url != "/favicon.ico"){ //获取路径 let pathname = url.parse(req.url).pathname; pathname = pathname.match(/w+/)[0]; //router具体,待写... router[pathname](req, res); }else{ res.end(); }; }).listen("80");console.log("Server running!");好了,接下来,我们就一起来编写router这个模块吧。
"use strict";var router = { login: function(req, res){ //TODO}, home: function(req, res){ //TODO }, getPic: function(req, res){ //TODO }};module.exports = router;且,我们发现login、home以及getPic这三个操作,有很多共通之处,如都会读取服务端本地文件,以及将读取的文件,写入响应体中,固我们将这些操作提取出来,作为operation模块。
"use strict";var fs = require("fs");var operationFile = { readFileSync: function(path, callback){//同步读取文件 let data = fs.readFileSync(path, "utf-8"); syncOperation(callback, data, "同步读取文件完毕"); }, readFileAsync: function(path, callback){//异步读取文件 fs.readFile(path, function(err, data){asyncOperation(err, callback, data, "异步读取文件成功"); });}, writeFileSync: function(path, data, callback){//同步写入文件 fs.writeFileSync(path, data); syncOperation(callback, null, "同步写入文件完毕");}, writeFile: function(path, data, callback){//异步写入文件 fs.writeFile(path, data, function(err){asyncOperation(err, callback, null, "异步写入文件完毕"); }); }, readImg: function(path, callback){//异步读取图片 fs.readFile(path, "binary", function(err, file){asyncOperation(err, callback, file, "异步读取图片完毕"); }); } };function syncOperation(callback, data, msg="操作成功"){ if(typeof callback === "function"){ callback(data); }else{ console.log(msg); } }function asyncOperation(err, callback, data, msg="操作成功"){ if(err){ console.log(err); }else if(typeof callback === "function"){ callback(data); }else{ console.log(msg); } }module.exports = operationFile;operation模块
"use strict";var url = require("url");var querystring = require("querystring");module.exports = { fromGet: function(req, res, callback){ var data = url.parse(req.url, true).query; callback(data);}, fromPost: function(req, res, callback){ var data = ""; req.on("data", function(chunk){data += chunk; }); req.on("end", function(){data = querystring.parse(data);callback(data); }); }};getQuery模块
res.writeHead(200, {"Content-Type":"image/jpeg"});