如何利用nodejs搭建一个框架

作者&投稿:氐窦 (若有异议请与网页底部的电邮联系)
如何用Node去写一个Web应用框架~

第一步,用node输出一个hello world
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方法上。实现起来很难么?其实只需要几句代码
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
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 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


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

本框架适合使用NodeJs进行web开发的MVC框架模式,本框架使用了express框架作为nodejs的web开发支撑,使用mysql作为数据库开发源,下面我们就简单的介绍如何利用本框架进行一个简单的web应用开发。当然本框架并非官方,也并非专业设计,希望开发者共同来把本框架设计好,以便我们可以在国内实现一个NodeJs的Web开发框架。

一、项目文件夹介绍

项目文件夹主要是根据传统的MVC设计模式,设计出来的框架。

enter image description here

二、 入口文件介绍

本框架的入口文件为index.js,该入口你可以添加多种全局静态变量,例如你所需要的各个文件夹路径,以及一些模块。

举例如下:

//========================全局变量定义===============================
global.BASE_DIR = __dirname;
global.APP = global.BASE_DIR + "/application/";
global.CON = global.APP + "/controller/";
global.CORE = global.APP + "/core/";
global.MODEL = global.APP + "/model/";
global.CONF = global.BASE_DIR + "/conf/";
global.log = global.BASE_DIR + "/log/";
global.PUBLIC = global.BASE_DIR + "/public/";
global.VIEW = global.BASE_DIR + "/view/";
/**



modules引入
*/
global.express = require(‘express’);
global.sio = require(‘socket.io’);
global.fs=require(‘fs’);
global.path = require(‘path’);
global.url = require(‘url’);
global.parseCookie = require(‘connect’).utils.parseCookie;
global.MemoryStore = require(‘./node_modules/connect/lib/middleware/session/memory’);
global.Session = require(‘./node_modules/connect/lib/middleware/session/session’);
global.sys = require(‘util’);


代码2-1:index.js



在index.js中你需要将你所有的文件夹路径、模块使用全局变量进行替换,该方法的优势在于,避免用户在编码中引入过长的文件路径,只需要使用简单的变量进行替换。

urlResolve = require(CORE + “url_resolve”);
urlResolve.getActionInfo();
代码:2-2:路由处理逻辑

本代码包含进逻辑处理类,同时应用逻辑处理类中的getActionInfo方法,创建服务器,并且处理url请求逻辑。

三、 路由处理逻辑

主要有六个方法,其中的getActionInfo是exports,其他方法均为私有方法。

exports.getActionInfo = function(){
systemConfig();
app.get('/:key', function(req, res){
callUrlRequest(req, res);
});
app.post('/:key', function(req, res){
callUrlRequest(req, res);
});
listenPort();
};
function callUrlRequest(req, res){
var routerMsg = getUrlConf();
var key = req.params.key;
var session = checkSession(req, key);
if(key == "favicon.ico"){return;};
if(session == 0){
res.redirect('/index');
return;
}
console.log("[key:"+ key +"] " + "[class:" + routerMsg[key].cla + "] " + "[controller:" + routerMsg[key].fun +"]");
require(CON + routerMsg[key].con);
var controllerObj = eval("new " + routerMsg[key].cla);
controllerObj.init(req, res);
controllerObj[routerMsg[key].fun].call();
}
代码2-3:路由处理getActionInfo
SystemConfig是配置express框架的相应数据,配置静态文件夹以及express框架的相应配置数据。之后添加两种url请求方式,分别是get和post方法,由于两种方法请求资源的路由处理都是一样的,因此使用callUrlRequest来处理。
callUrlRequest 获取路由配置文件信息getUrlConf;
2、获取当前访问的key值,根据key值得到相应的配置信息,配置文件可以展示如下:
"test": {
"con" : "test",
"cla" : "test",
"fun" :"test"
},
"favicon.ico" : {
"con" : "",
"cla" : "",
"fun" : ""
},
"login" : {
"con" : "index_controller",
"cla" : "IndexController",
"fun" : "loginAct"
},
"index" : {
"con" : "index_controller",
"cla" : "IndexController",
"fun" : "loginPageAct"
},
"loginS" : {
"con" : "index_controller",
"cla" : "IndexController",
"fun" : "toMainPageAct"
}
}
代码2-4:配置文件信息
如果当前key为test那么我们就可以得到相应的controller、class和function。同时因为nodejs服务器每次请求数据的时候都会加入favicon.ico,因此在代码中我们需要将其剔除。对于checkSession就是验证登录信息。
3. 得到controller、class和function,首先require相应的controller,然后使用eval来new相应对象,使用controllerObj[routerMsg[key].fun].call();该方法进行调用。(本部分处理,涉及到一个JavaScript的小技巧,如何对一个字符串进行new,同时调用一个对象的方法,该方法名为字符串变量)
4. 最后就是listenPort();进行监听事件,也是服务器开始启动。这样一个基本的路由处理就完成实现了。
**四、 数据层实现**
本系统数据层基类是在core文件夹下的base_model.js,该类主要包含数据库的一般方法,主要含有数据库链接、数据库操作基本方法add、update、deleteItem、query、select等,具体实现方式,就不细讲。
BaseModel为基类,其他对应于相应的表的类都继承来自BaseModel基类
继承方法使用JavaScript的原型继承:
IndexController.prototype = new BaseController();
global.IndexController = IndexController;
**五、 逻辑层实现**
类同于数据层的实现方法,其继承都是来自于基类BaseController,BaseController现只包含三个方法:init、displayHtml、displayJade。
**六、 代码规范
** 本框架不要求开发者是如何去定义代码规范,但本框架实现的代码规范是如下:
变量命名:私有变量统一使用”_name”,全局变量使用大写”VIEW”,简单变量请使用骆驼峰”myName”
方法命名:所有方法请使用骆驼峰”getUrlRequest”
类命名:统一使用首字母大写骆驼峰”BaseController”
文件命名:统一使用下划线分割,类使用下划线分割base_controller.js
总结:整体上就可以实现一个MVC开发的MyWeb框架,其中的方法以及实现都还是处于稚嫩期,希望有开发者愿意加入,并且能够团队合作开发出我们国内优秀的NodeJs的MVC框架。

希望大家是一起交流学习,这里还有很多不足,希望大家一同改进~

获取Node安装包,可以访问以下Node.js框架官方网址:

在该页面中,我们可以看到适用于不同操作系统的、各个版本的Node安装包源文件,选中我们需要的版本类型直接下载就可以了。

2

在Windows操作系统环境下安装Node.js框架,直接运行下载好的Node安装包      源文件即可,目的路径一般选择如下:

D:/nodejs/

3

安装完毕后,读者可以到该目录下浏览一下具体内容,这样会对Node环境有一个大致的了解。

    方法/步骤2

    在Ubuntu(Linux)环境下需要运行apt命令进行安装,具体方法如下:

    sudo apt-get install nodejs

    如果想获取最新的Node安装源,具体方法如下:

    sudo add-apt-repository ppa:chris-lea/node.js

    sudo apt-get update

    sudo apt-get install nodejs

    3

    一般情况下,node命令会被自动安装在以下路径之中(视不同的Ubuntu系统版本而定):

    /usr/local/bin/node

    END

    方法/步骤3

    1

    大致经过以上这几步的操作,Node.js框架就安装完毕了,为了检验Node环境是否正确,可以使用以下命令检测Node的版本:

    node -v

    2

    如果显示出正确的版本号,则说明Node环境搭建成功了。

    如果想要更好地学习nodejs,可以练练代码段的相关图书。




nodejs怎么post文件流
获取http请求报文头部信息 利用nodejs中的 http.ServerRequest中获取1):request.method 用来标识请求类型 request.headers 其中我们关心两个字段:content-type 包含了表单类型和边界字符串(下面会介绍)信息。content-length post数据的长度 关于content-type get请求的headers中没有content-type这个字段 post ...

node.js适合做什么网站
(2)开多个进程监听同一个端口,使用cluster模块;4. 开源组件库质量参差不齐,更新快,向下不兼容 5. Debug不方便,错误没有stack trace NodeJS的应用场景:实时应用:如在线聊天,实时通知推送等等(如socket.io)分布式应用:通过高效的并行I\/O使用已有的数据 工具类应用:海量的工具,小到前端压缩...

nodejs 创建什么对象启动应用程序
在刚开始使用nodejs的时候,也是很随意的写一些函数,然后从上至下执行这些函数。如果需要其他js文件中的函数,就require那个文件。这在编写一些比较简单的程序的时候是行得通,并且是简单的。但是如果当程序的逻辑变得复杂,变量很多并且有不同的作用的时候,过程式的编程方式就会变得非常麻烦。况且nodejs中...

请问怎么写java调用node环境运行js代码?
nodejs 运行代码可以在命令行中使用命令“ node \/path\/xxx.js ”来执行 所以我们可以借助 java 的 Runtime 类,可以执行系统本地的命令, 例如:Linux系统下:Runtime.getRuntime().exec("node \/path\/xxx.js");Window系统下:Runtime.getRuntime().exec("cmd \/c node \/path\/xxx.js");当然...

服务器部署nodejs的几种方法
pm2 是一个带有负载均衡功能的Node应用的进程管理器.当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着 安装方法 npm install -g pm2 使用方法 启动应用 pm2 start -watch app.js 重启应用 pm2 restart app.js 显示进程列表 pm2 list 停止某应用 pm2 stop app_name|app_id ...

基于webrtc以及nodejs的P2P实时视频demo
到 http:\/\/nodejs.org\/ 下载最新版nodejs。【点击免费试用,0成本启动】https:\/\/github.com\/webRTC\/webrtc.io-demo这个是一个在nodejs下实现webrtc服务端的完整示例。下载zip文件,解压。回到“Node.js command prompt”,使用CD命令切到解压后的目录,输入命令:npm install这个命令会自动安装demo所...

如何在Windows下的V8\/Nodejs中实现ActiveXObject
1. 网上找的实现方法 网上找了半天,没有一个实现的解决方案。那些大侠们的江湖可能都是Linux,从来不操心Windows的。找到唯一靠谱的解决方案如下:参见1:用nodejs访问ActiveX对象,以操作Access数据库为例。这个总体上来说是利用Windows自带的脚本解释器来调用ActiveXObject,然后将处理结果返回给主进程。由于...

使用Node.js 的优势和劣势都有哪些
Node.js 程序占用内存 90MB-110MB,剩余内存都被磁盘缓存占据。以我的了解,Python 和 Ruby 上的非 Event Driven 的 Framework 根本不可能达到这样的性能。然后说说 Node.js 的其他优点 Node.js 的架构与 Django, Rails 等传统的 Framework 不同,不需要放在 Nginx \/ Apache 后,利用 WSGI, CGI ...

Node.js 与 Python 作为后端服务的编程语言各有什么优劣
(2)开多个进程监听同一个端口,使用cluster模块; 4. 开源组件库质量参差不齐,更新快,向下不兼容 5. Debug不方便,错误没有stack trace 四. 适合NodeJS的场景 1. RESTful API 这是NodeJS最理想的应用场景,可以处理数万条连接,本身没有太多的逻辑,只需要请求API,组织数据进行返回即可。它本质上只是从某个数据库...

nodejs是单线程还是多线程
相反,它是一个满足特别需求的平台。你肯定不会希望使用 Node.js 去做 CPU密集型操作。事实上,使用它进行繁重的计算等于摒弃 Node 几乎所有的优点。Node 真正的亮点在于建设高性能,高扩展性的互联网应用——因为它能够处理庞大的并且高吞吐量的并发连接。它的工作原理是相当有趣的。传统的网络服务技术...

伊春市15232006859: 怎样用Node.js快速搭建服务器 -
朱庭奇诺: 方法/步骤1 如果电脑没有安装nodejs的同学可以先到node官方下载并安装好node程序. 安装好nodejs后验证一下是否安装成功!如果出现则表明node已经承装安装上去了!2 安装好node之后打开cmd 输入 npm install ...

伊春市15232006859: 如何搭建web前端框架 -
朱庭奇诺: 搭建web前端框架步骤如下:1、确定项目使用的技术 根据项目的需求等来选择使用的技术(这里以angular4 + typsescript + nodejs+mongodb举例)2、新建一个项目的工作文件夹 使用npm init初始化项目,根据问题配置,一般是直接回车使用...

伊春市15232006859: 怎么用nodejs搭建web服务器 -
朱庭奇诺: 自行实现:可以在服务器端直接返回html代码或读取文件返回; 框架:可以通过nodejs的第三方框架来指定渲染模版,返回页面;

伊春市15232006859: 怎么用nodejs搭建http服务器 -
朱庭奇诺: 1.Node.js安装包及源码下载地址为:Git下载地址为:.2.按照安装提示操作即可,选择安装路径、npm.3.环境变量默认C:\Users\Administrator\AppData\Roaming\npm\node_modules.创建新的变量创建方法:我的电脑>属性》高级系统...

伊春市15232006859: 如何搭建webdriver+selenium+nodejs自动化测试框架 -
朱庭奇诺: 1 安装nodejs程序包 2 打开nodejs 从开始程序中选择Node.js--->Node.js command prompt 3 在命令窗口输入以下命令 一、npm install webdreverio -g 二、npm install selenium-standalone@latest -g 4 安装selenium服务,在命令窗口输入以及下命...

伊春市15232006859: 如何在node.js搭建服务器 -
朱庭奇诺: 准备 首先,需要安装nodejs,这个可以去官网下载,目前我本地安装的v0.12版本.安装完成后可以通过命令行测试安装是否成功,输入:node -v,应该会显示当前安装node版本号. 本文中用到的模块,都是nodejs核心模块,不需要从外部下...

伊春市15232006859: 如何在 NodeJs 上搭建 React 开发环境 -
朱庭奇诺: 1、首先安装了nodejs 4.1 版本2、然后 安装了 npm install -g react-native-cli 模块3、安装 android sdk 并且配置android 环境变量4、安装gradle 环境5、进入 这个博客 里边有 react-native for android 项目,下载下来,然后执行 npm install 先安装 react 依赖模块包6、打开两个 命令窗口 1. 一个 执行react-native start ,另一个执行react-native run-android 就可以了

伊春市15232006859: nodejs restify 框架怎么搭建 -
朱庭奇诺: 可以私聊我~

伊春市15232006859: nodejs搭建服务器运行php -
朱庭奇诺: nodejs其实是非常底层的,从功能上说,它既是apache也是php.像搭建http服务器这种功能,本来是apache已经封装好的,但nodejs需要我们手动来搭建.其实在实际应用中,我们可以使用现成的框架.但这里,我想手动搭建,也加深一下对http服务器的理解.我们node执行下面这个文件,我命名为http.js,它将创建一个httpServer并监听3000端口.

伊春市15232006859: 如何用nodejs做一个简单的前端Static Server -
朱庭奇诺: var http = require('http'); var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', user : 'me', password : 'secret',});//开始你的mysql连接 connection.connect(); var server = http.createServer(function (req, res) { //如...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网