express

正如ASP.NET MVC 在作为.net平台下最佳的 Mvc框架的地位一样,expressnode.js 环境也有着相同的重要性。在百度上 "nodejs express" 会跑出一大堆关于怎么用开发 express 来开发mvc文章 ,相同的内容在这里我不想重复叙述,关于express的入手文章大家到百度上搜就好了。这只是一篇随笔不是教程, 我是想用ASP.NET MVC与 express 来在他们擅长的方面上做一些比较,从中看看我们作为开发人员能得到什么,哪一个对于我们更能带来好处。

express 与 OWIN

OWIN 全名为:Open Web Interface for .net , 是一套可以让你在IIS中开辟中一套独立运行环境,按需配置模块可独立的应用程序框架。我不知道我的解释是否准确,更多的内容可以参考:"Getting Started with OWIN and Katana" 和 Katan 在Codeplex上的项目。 简单点理解就是你可以通过纯代码,在一个启动文件内配置一些已有的“中间件(middel ware) ” 来配置你的Web的功能。下面来看一段代码,这段代码是从asp.net上截取的,是向网站加入一个 日志的中间件实现日志记录

日志中间件实现

public class LoggerMiddleware : OwinMiddleware
{
private readonly ILog _logger; public LoggerMiddleware(OwinMiddleware next, ILog logger) : base(next)
{
_logger = logger;
} public override async Task Invoke(IOwinContext context)
{
_logger.LogInfo("Middleware begin");
await this.Next.Invoke(context);
_logger.LogInfo("Middleware end");
}
}

启动文件

public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use<LoggerMiddleware>(new TraceLogger()); var config = new HttpConfiguration();
// configure Web API
app.UseWebApi(config); // additional middleware registrations
}
}

到此,如果你是一位MVC开发人员那么请先不要往下看,现在需要一点点的时间给你思考一下,这个东东的意义在哪里,与我们使用的常规MVC有何区别?这个代码跑起来要比运行在MVC快得多得去了,起码IIS不会起动IIS模块加载机制,也不会预编译页面。

我认为OWIN在ASP.NET MVC内是一个很了不起的框架,他可以简化掉现在MVC内很多不必要的模块。这些不必要的模块在让我们的程序变得臃肿、庞大。明明一个小小的Web如果用MVC来做的话,你会发现用php或者直接用ASP.NET PAGES 做会比它快好多。 有可能OWIN是未来ASP.NET MVC版本发展的一个走向,作为开发人员我们有权利确定哪些东西是我们要的,哪些是我们不要的,而不是一股脑地将“强大”的功能塞到我们的项目里面。

接下来我们看看相同的功能在 node.js中是怎么做的,然后大家来评估一下哪个更好:

app.js (express启动的必备文件)

var express = require('express');
var logger = require('morgan');
app.use(logger('dev'));
app.listen(3001);

在代码之间对比实际大家在app内写的东西都不多,但值得注意的是express一个成熟的框架,而OWIN是个新生儿。OWIN内做的事都要你自己一个一个地实现,而express内可能只是到npm上找找有哪些好用的模块装一下就完事了。现在asp.net官网上找到的所有关于OWIN的范例在node.js加构下早就有出了名的现成模块了,就好像OAUTH 这个苦B功能,在asp.net上有非常多的内容在说它,你可以试试在express上做,简直就是手至擒来的。

SignalR

说说 SignalR ,关于这个内容开始接触时解得他真的非常赞,但看了google在对 WebRTC 上的技术演示以后就觉得 SignalR 是一个大忽悠。 SignalR实际上只是通过 WebStocket 来做反向通信的一种机制(服务端->客户端)。微软称为 服务器与浏览器的"实时通信",其中的内容并不难实现,但可惜的是WebStocket正在被WebRTC技术所取缔,SignalR 做的一大堆东西我们都可以在 nodejs 下 安装一个非常著名的模块: socket.io 一下搞定,而且socket.io不单可以做到服务器与客户端之间做实时通信,还可以做很多即时通信的功能,功能极其强大!

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
io.on('connection', function(){ /* … */ });
server.listen(3000);

这就是一个使用socket.io 在express构建的最简单的通信服务器代码。SignalR的那点事就不想说了,实在连解释它也觉得很累。(^_^ 我是一个很懒很喜欢简单的人)。 建议如果想入手 SignalR 的朋友可以先看看关于 socket.io , 现在的微软与以前不一样了,老鮑将MS玩烂了将很明明很简单的东西都做成了没人愿意用的庞然大物,甚至连我们跟随MS做技术的也同时遭殃。

路由 Routing

我更喜欢 epxress 在Routing的使用,它的定义处理方式都比较简单易懂,而且他更容易获取当前运行的路由对象,用代码说话吧:

var express = require('express');
var router = express.Router(); router.get('/invoice/:id', function(req, res) { var id= req.params.id; ... }).post(function(req,res) {
//直接控制POST方法
var postData=req.body;
...
});

1. 对参数和的定义会比在ASP.NET中使用正则表达式更简单(当然这里也可以直接写正则表达式)

2. 注意 req.body 这个对象(需要先引入body-parser 模块),这个是由浏览器端Post过来的Form而且已经是一个JSON对象,不像MVC内要搞ODATA才能正常处理JSON

3. 一边定义一边编码,这是我喜欢的。当一个项目中路由多了,这样做的话找起来非常容易。

再回头看看MVC对Router的定义:

首先是RouteConfig.cs (最让人讨厌的是每个 Route都需要有名称!)

    public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Invoice", action = "Index", id = UrlParameter.Optional }
);
}
}

然后是:InvoiceController.cs

    public class InvoiceController : Controller
{
public ActionResult Index(int id)
{
return View();
}
}

当我的项目中有超过 50个路由定义,我就要老在找路由与控制的关系....... 苦B啊....

视图引擎

我在ASP.NET MVC项目中基本上不会使用其它的视图引擎,因为觉得没有其它的比Razor更好更快。第一次使用node.js的时候我是有点懵,因为express 上能支持的视图引擎实在是太多了!我认为选择多对开发人员来说并不是一件很实在的大好事,因为对于一个小白的话选谁才是最好的,这个才是一个大难题。 经过一番google, 最后也就找到了它— jade. 与Jade齐名的还有: EJS , CoffeeKup . 最终还是觉得jade的代码量是最少的,最容易懂的。经过一两个小时的阅读与实验基本上就学会了。从代码量来说可以比Razor少上一半,运行速度极高。还有我最喜欢的一点是他可以支持动态编译与输出。这要在Razor做的话那就得实现一个VirtualProvider类将页面嵌入到assembily中才能实现了,过程非常痛苦。这里只想show两段代码,一段是对jade的一瞥,另一段是动态编译页面。(这里我就懒一点了,不帖asp.net MVC的实现了,有兴趣的话你自己可以尝试一下用ASP.NET MVC实现一下,由其是第二步)

看看jade

定一个与asp.net MVC中类似的layout.jade(母板)

doctype html
html
head
title= title
include ./includes/head
link(href="/styles/style.css" , rel="stylesheet")
block head
body.page
block header
block content
block footer

然后搞一个login.jade

extends ../layout

block content
.row
div(class="col-lg-4 col-md-8 col-sm-12 col-lg-centered")
form.text-center(style="padding:20px;")
div
img(src="/logo.png")
p
.input-group
span.ctrl-addon
i.icon-user-3
input#userName(type="text" name="userName" required="required" autofocus="autofocus" placeholder="Enter your user account or email")
p
label
input(type="checkbox" name="rememberMe")
span Remember me
span.pull-right
a Forgot your password?
p
button(class="primary fill-width") Login
div
a.fill-width(role="button") Sign up

对比一下Razor就知道到底少了多少代码。

动态编译 - 动态输出一个能支持markup格式的网页内容

app.use("/dynamic-page/",function(req,res){
var lines=[];
//让引擎直接格式化markup的输出 lines.push("markup:");
lines.push(" **粗体** 字");
lines.push("p.");
lines.push(" 这里是一段最为简单的段落文字");
lines.push("#{model.name}") ;

var _fn=jade.compile(lines.join("\n"));
res.send(_fn({ model:{ name:"我是动态编译的上下文对象名" } } ));

在ASP.NET MVC中在Action内动态输出文本绝无问题,但如果要传入一个上下文对象然后再动态编译输出那就是件极痛苦的事了。这个功能由其是在做邮件模板时是非常有用的,我在ASP.NET MVC内只能再找一个动支持Razor语法的类库再重编译输出这个网页内容,这种做法想想都够脑残的。

小结

搞好好几天觉得nodejs+express就是一个字:! 而更多关于express的功能我就不在这里说了,大家去官网看吧。如果你有不同的看法或者认为express还有更玄的功能,那就给我留言吧。

相关资源:

安装 : npm install express 

官网:http://expressjs.com/

NodeJS旅程 : express - nodejs MVC 中的王牌的更多相关文章

  1. 【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--目录(8/8 完结)

    为什么要做这个 在使用nodejs开发过程中,总是发现需要做很多重复性的体力劳动,且因为自身是服务端程序员出身,感觉有一些服务端好的东西其实可以在nodejs上得到应用并能提高一些开发工作效率. 本系 ...

  2. nodejs安装express不是内部或外部命令

    工具/原料  Node.js安装包 方法/步骤  首先下载Node.js安装包,此处我用的是官方最新的v0.10.27 32位版: http://nodejs.org/dist/v0.10.27/no ...

  3. [转] NodeJS框架express的途径映射(路由)功能及控制

    NodeJS框架express的路径映射(路由)功能及控制 我们知道Express是一个基于NodeJS的非常优秀的服务端开发框架,本篇CSSer将提供express框架的route和route co ...

  4. 阿里云主机Nginx下配置NodeJS、Express和Forever

    https://cnodejs.org/topic/5059ce39fd37ea6b2f07e1a3 AngularJS中文社区即运行在阿里云主机上,本站使用Nginx引擎,为了AngularJS,我 ...

  5. Windows和Mac上NodeJS和Express的安装

    一.安装NodeJS,官网上下载,https://nodejs.org/en/ 直接下一步安装就行了. 打开命令行工具,输入 node -v 则会出现node的版本,则成功了. 下面我们介绍如何安装e ...

  6. Express+Nodejs 下的登录拦截实现

    Express+Nodejs 下的登录拦截实现 利用商城举例,在商城中没有登录之前,可以看商品列表.详情.登录或者注册都可以,但是购买的时候是不行的,那么这个功能在Node后台中是怎么实现的呢,这个功 ...

  7. nodejs库express是如何接收inbound json请求的

    这样几行简单的代码创建一个web服务器: var express = require('express'); var app = express(); var server = require('ht ...

  8. nodejs之express静态路由、ejs

    1.静态路由与ejs使用 /** *1.安装ejs npm install ejs --save-dev * *2.express 里面使用ejs ,安装以后就可以用,不需要引入 * *3.配置exp ...

  9. 使用nodejs和express搭建http web服务

    目录 简介 使用nodejs搭建HTTP web服务 请求nodejs服务 第三方lib请求post 获取http请求的正文 Express和使用express搭建http web服务 express ...

随机推荐

  1. 调整 Windows VM 的大小

    本文说明如何使用 Azure Powershell 调整在 Resource Manager 部署模型中创建的 Windows VM 的大小. 创建虚拟机 (VM) 后,可以通过更改 VM 大小来扩展 ...

  2. 反向代理负载均衡调度:nginx

    一.概述 反向代理:以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个 ...

  3. Relinking Oracle Home FAQ ( Frequently Asked Questions) (Doc ID 1467060.1)

    In this Document   Purpose   Questions and Answers   1)  What is relinking ?   2)  What is relinking ...

  4. 进程控制编程——Linux编程

    1.进程的创建 编写一段程序,使用系统调用fork( )创建两个子进程,在系统中有一个父进程和两个子进程活动.让每个进程在屏幕上显示一个字符:父进程显示字符“a”,子进程分别显示字符“b” 和“c”. ...

  5. Windows7 添加快速启动栏

    解决方案: 1.右击任务栏空白处,选择“工具栏”,单击“新建工具栏”: 2.输入“%userprofile%\AppData\Roaming\Microsoft\Internet Explorer\Q ...

  6. skype客户端搜不到联系人解决办法

    1.确认skype客户端登陆的配置信息 按住Ctrl 键不放,右击右下角任务栏 skype 图标,选择:配置信息,确认skype的:GAL搜索或基于服务器的搜索为:基于服务器的搜索,如下图所示: 2. ...

  7. win7 win10双系统开机系统引导

    以win7启动管理器引导作为启动引导 安装一个easybcd 然后里面添加引导选项(添加新条目---->编辑引导菜单(选择倒计时30秒)把use metro bootloader勾去掉就是默认的 ...

  8. python基本语法:

    http://www.runoob.com/python/python-basic-syntax.html

  9. SDN2017 期末作业验收

    GIT仓库:GITHUB 负载均衡程序 拓扑如图 目的 实现一个负载均衡的北向程序: 服务器host 2 ,host 3,host 4上各自有不同的服务,host 1是客户端 当host 2,host ...

  10. 1083. [SCOI2005]繁忙的都市【最小生成树】

    Description 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道 路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路 ...