前言
目的是实现form.ejs页面的数据能被接收并呈现,然后URL改变时页面能够正常跳转
URL中有扩展名的时候交给静态web解决, 没有扩展名交给路由解决
routes.js模块中封装了static()方法来确保文档类型正确, 顺便做静态web.
app.js模块负责服务器和路由;
views目录中存放所有页面
先解决routes.js吧,到时候我们直接把它的方法调到app.js中用就好了.
一、routes.js
引入模块
文件模块fs和核心模块path;
我们要用到它们中的方法;
1 | const fs = require('fs'); |
getFileMime()方法
这个方法能够接收传入的文件扩展名, 然后在mime.json中查找相应字符串(像”text/html”这种格式的)并返回, 而我们会在封装static()方法时用到这种字符串来界定响应头.
如你所见, 这里存着各种扩展名对应的contentType;
嗯…然后我们开始吧,先封装getFileMime处理好mime.json的数据, 准备给static用.
1 | function getFileMime(extname) { |
接收extname, 这个参数会由调用getFileMime()的static()方法从app.js接收并提供, 我们现在还不用担心, 只要知道他是一个”.后缀名”(比如”.html”)格式的参数即可.
调用文件模块的readFileSync同步读取路径对应的JSON文件(没读完之前需要阻塞),然后将读取结果即mime.json中所有的内容存入变量data.
readFileSync()读取出来的是16进制的buffer数据, 我们用toString()将其转换为字符串,再用JSON.parse()转换为对象, 这样就将mime.json以原本的格式弄出来了.
1 | function getFileMime(extname) { |
然后把mimeObj[extname]返回, 因为参数extname前缀都有个”.”, 直接”mimeObj.extname”会翻车, 所以用了”mimeObj[extname]”;
这最后一部就是根据传入的扩展名将对应的ContentType返回;
static()方法
我们需要导出这个方法, 它得在app.js中被调用接收参数;
因为代码太长所以每句说明都写在其下;
1 | exports.static = function (req, res, staticPath) { |
到这为止routes.js就写完了, 但它只能负责页面的正确文件解析方式和静态web, 和给routes提供参数req;
另外刚才提到没有扩展名的URL我们需要交付路由进行处置,这些也要在app.js中完成, 会有一个类似于Vue路由表的结构.
二、app.js
我们的服务器建立在此处, 获取到用户在客户端发送的请求信息req和相应res,利用这两个参数, 我们就可以判定他到了哪个页面, 现在该发点甚麽给他那边来生成页面;
引入模块
我们需要使用这些模块中的方法;
1 | const http = require('http'); |
主体
1 | http.createServer(function (req, res) { |
总结
就是记录个流程, 更好的方法当然是有的.