为了账号安全,请及时绑定邮箱和手机立即绑定

请教一下关于node 路由中间件有哪些框架?

/ 猿问

请教一下关于node 路由中间件有哪些框架?

慕容708150 2019-11-19 18:14:36

node 路由中间件有哪些框架


查看完整描述

3 回答

?
慕后森

第一步,用node输出一个hello world

123456    var http=require('http');     http.createServer(function(req,res){         var urlPares=url.parse(req.url);         var query=querystring.parse(urlPares.query);         res.end('hello world');     }).listen(80);

大部分的node教程在这里会告诉你,我们很容易的建立的一个服务器。但是在实际使我们通常使用的是express.(f**k,难道Node必须要用express吗?自己实现一个Web应用框架真的很难吗?)其实并不是。那么既然打算自己写我们首先要知道我们要做哪些事情。 1.路由或者智能路由 2.静态文件输出 3.session/cookie 4.模版渲染 5.数据库处理 6.文件上传第二步,路由路由好高大上的名字,它是干啥的?url对应具体方法就是它该做的事情。 那么我们为什么不让url对应xxx文件的xx方法。 例如:/user/login能不能自动对应到user.js的login方法上。实现起来很难么?其实只需要几句代码   

123456789101112131415161718192021222324252627282930313233 var fs = require("fs");     module.exports=function(req,res){         var query=req.query;         var urlPares=req.urlPares;         var pathname=urlPares.pathname;         var arr=pathname.split("/");         req.arr=arr;         //start 这段代码处理默认行为。可以先忽略         if(arr.length==0||arr.length==1){             arr=["","index","index"];         }else if(arr.length==2){             arr.push("index");                 if(arr[1]==""){             arr[1]="index"                if(arr[2]==""){             arr[2]="index"                //end 这段代码处理默认行为。可以先忽略         if (fs.existsSync(APP_PATH+'/controller/'+arr[1]+'.js')){             var controller=require('./controller/'+arr[1]);             if(controller[arr[2]]){                 controller[arr[2]](req,res);             }else                res.writeHead(404,{'Content-Type''text/plain' });                 res.end("你访问的控制器不存在指定方法");                     }else            res.writeHead(404,{'Content-Type''text/plain' });             res.end("你访问的路径不存在");             }

通过fs判断文件是否存在。然后去require它就行了。APP_PATH是个全局变量表示程序入口的路径。第三步,静态文件输出静态文件输出我们需要一个库MIME  

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119  var url = require("url");     var fs = require("fs");     var mime = require('mime');     /**      * [[检测是否为静态资源]]      * @param   {Object}   req [[Description]]      * @param   {[[Type]]} res [[Description]]      * @returns {bool} [[Description]]      */     module.exports = function (req, res) {         //正则表达式检测文件后缀         var url_resource_reg = /.*\.(html|htm|gif|jpg|jpeg|bmp|webp|htc|swf|png|ico|txt|js|css)/;         if (!url_resource_reg.test(req.url)) {             return false                var urlPares = url.parse(req.url);         var pathname = urlPares.pathname;         var fileUrl = APP_PATH + "/static" + pathname;         if (fs.existsSync(fileUrl)) {             var contentType = mime.lookup(fileUrl);             res.setHeader('Content-Type', contentType || "text/plain");             var fileStream = fs.createReadStream(fileUrl);             fileStream.pipe(res);             fileStream.on('end'function () {                 res.end();             });             return true        else             return false            第四步,session/cookie这里稍微有点。但是代码量也不多    var sessions = {};     var sessionKey = 'session_key'    var EXPIRES = 30 * 60 * 1000;     function randString(size) {         var result = ''        var allChar = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'        size = size || 1;         while (size--) {             result += allChar.charAt(rand(0, allChar.length - 1));                 return result;         var generate = function () {         var session = {};         session.id = Date.now() + randString(12);         session.cookies = {             expire: Date.now() + EXPIRES                 sessions[session.id] = session;         return session;         var parseCookie= function (cookie) {         var cookies = {};         if (!cookie) {             return cookies;                 var list = cookie.split(";");         for (var i = 0; i < list.length; i++) {             var pair = list[i].split("=");             cookies[pair[0].trim()] = pair[1];                 return cookies;         var serializeCookies = function (cookies) {         var arr = [];         for (var key in cookies) {             arr.push(serialize(key, cookies[key]));                 return arr;         var serialize = function (name, value, option) {         var pairs = [name + '=' + encodeURI(value)];         //设置cookie默认共用"/"路径         option = option || {             path: "/"         };         if (option.maxAge) pairs.push('Max-Age=' + option.maxAge);         if (option.domain) pairs.push('Domain=' + option.domain);         if (option.path) pairs.push('Path=' + option.path);         if (option.expires) pairs.push('Expires=' + option.expires);         if (option.httpOnly) pairs.push('HttpOnly');         if (option.secure) pairs.push('Secure');         return pairs.join('; ');         module.exports = function (req, res) {         req.cookies = parseCookie(req.headers.cookie);         var id = req.cookies[sessionKey];         if (!id) {             req.session = generate();         else             var session = sessions[id];             if (session) {                 if (session.cookies.expire > Date.now()) {                     session.cookies.expire = Date.now() + EXPIRES;                     req.session = session;                 else                     delete sessions[id];                     req.session = generate();                             else                 req.session = generate();                             for (var key in sessions) {             if (sessions[key].cookies.expire < Date.now()) {                 delete sessions[key];                             var writeHead = res.writeHead;         res.writeHead = function () {             delete req.cookies[ham_sessionKey];             var sessionStr = serialize(ham_sessionKey, req.session.id);             res.setHeader('Set-Cookie', serializeCookies(req.cookies).concat(sessionStr));             return writeHead.apply(res, arguments);             }

第五步,模版渲染


这是最简单的。


第六步,数据库处理


这里可以是用一些ORM框架。


第七步,文件上传,post


第八步,就是你把上面的代码组织起来。


查看完整回答
反对 回复 2019-11-29
?
桃花长相依

首先安装express模块,cd到文件夹中,使用npm install express命令安装express module后,会发现文件夹中多了node_modules目录,里边会有express模块了。
进入到任意一个文件夹,执行express app命令,就会创建一个app的应用项目,结构如下:
E:\nodejs\express_demo>express app

create : app
create : app/package.json
create : app/app.js
create : app/public
create : app/bin
create : app/bin/www
create : app/public/stylesheets
create : app/public/stylesheets/style.css
create : app/views
create : app/views/index.jade
create : app/views/layout.jade
create : app/views/error.jade
create : app/public/images
create : app/routes
create : app/routes/index.js
create : app/routes/users.js
create : app/public/javascripts

install dependencies: (这里指示安装必备的包)
$ cd app && npm install

run the app: (这里指示执行,使用npm start)
$ DEBUG=app ./bin/www

cd进入app文件夹中,执行app,使用命令node app这时候会报错,因为第一次使用express框架的话,缺少很多必备的modules
报错:

module.js:340
throw err;
^
Error: Cannot find module 'serve-favicon'//表示缺少serve-favicon模块
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.<anonymous> (E:\nodejs\Node.js寮€鍙戝疄鎴榎chapter_two\express_dem
o\app\app.js:3:15)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)

这个时候根据提示,安装必备的modules就可以了,如图
Your environment has been set up for using Node.js 0.10.26 (ia32) and npm.

C:\Users\Administrator>e:

E:\>cd nodejs

E:\nodejs>npm install serve-favicon
serve-favicon@2.2.0 node_modules\serve-favicon
├── ms@0.7.0
├── parseurl@1.3.0
├── fresh@0.2.4
└── etag@1.5.1 (crc@3.2.1)

E:\nodejs>npm install morgan
morgan@1.5.1 node_modules\morgan
├── basic-auth@1.0.0
├── depd@1.0.0
├── debug@2.1.1 (ms@0.6.2)
└── on-finished@2.2.0 (ee-first@1.1.0)

E:\nodejs>npm install cookie-parser
cookie-parser@1.3.3 node_modules\cookie-parser
└── cookie-signature@1.0.5

E:\nodejs>npm install body-parser
body-parser@1.12.0 node_modules\body-parser
├── content-type@1.0.1
├── raw-body@1.3.3
├── bytes@1.0.0
├── depd@1.0.0
├── qs@2.3.3
├── iconv-lite@0.4.7
├── on-finished@2.2.0 (ee-first@1.1.0)
├── debug@2.1.1 (ms@0.6.2)
└── type-is@1.6.0 (media-typer@0.3.0, mime-types@2.0.9)

E:\nodejs>

安装完成所有必备的modules后,在此执行app,项目根目录下npm start命令,如果还是提示类似Error: Cannot find module 'jade'错误的话,继续安装必备的模块

6
以上所有的一切完成后,在浏览器下输入http://127.0.0.1:3000/,如下图就表示成功了。

查看完整回答
反对 回复 2019-11-29
?
莫回无

Express 介绍
Express是一个最小的,灵活的Node.js Web应用程序框架,它提供了一套强大的功能来开发Web和移动应用程序。 它有助于基于Node Web应用程序的快速开发。下面是一些Express框架的核心功能:

允许设立中间件响应HTTP请求

定义了用于执行基于HTTP方法和URL不同动作的路由表

允许动态渲染基于参数传递给模板HTML页面

安装Express
首先,安装Express 框架全局使用NPM,以便它可以被用来使用Node终端创建Web应用程序

$ npm install express --save
上面的命令在本地node_modules目录保存安装,并创建一个目录express在node_modules里边。还有,应该使用express安装以下几个重要的模块:

body-parser - 这是一个Node.js中间件处理JSON,Raw,文本和URL编码的表单数据

cookie-parser - 解析Cookie头和填充req.cookies通过cookie名字键控对象

multer - 这是一个Node.js的中间件处理multipart/form-data

查看完整回答
反对 回复 2019-11-29

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信