NodeJS的流行也带来了开发由前端转到全栈,前端不再局限于页面如何展现,用户如何操作,也设计到整个应用的架构以及业务流程。

本篇来简单的通过实例,讲述node中web开发的模式。

参考来自《Node web开发》一书。

关于node

  node是基于事件的异步驱动系统,通过可扩展的方式创建网络服务器。

  例如,创建一个网络服务器:

var http_port = 8124;
var http = require('http'); var server = http.createServer(function (req,res){
....自己的代码
}); server.listen(http_port);

  这样就可以创建一个简单的服务器。

关于npm

  npm是node的包管理工具,node里面有很多的模块,可以通过require('模块名字')的方式加载到项目中。

  常用的命令:

npm init 创建项目的package.json文件,配置其信息以及依赖项
npm install 通过package.json的声明,安装需要的包
npm install xxxx 安装xxxx包
npm install xxxx --save-dev 以开发模式安装xxxx包,当用于生产环境时,不会下载开发模式的xxxx

关于项目布局

  在node中,很注重模块化,按照commonjs的思想,尽量把功能分散到模块中进行重用。

  但是也有点弊端,会出现很多松散的文件,不易于管理。

  通常node中都会把第三方的模块包,放在node_modules文件夹中,node也会在require()的时候,自动向上搜索该文件家,引用其js。

  node_modules中的js文件,大多是一些加载自动执行的文件,或者对外暴露出一定的接口,比如:

(function(a,b){}(
this,
function(){
//.....
}));

  或者

var xxx = require('xxx');

exports.funca = function(){
//.......xxx
} exports.funcb = function(){
//.....xxx
}

关于代码

  本篇的项目做了一个小网站,通过模块化开发,项目组织如下:

app:

|——app-node.js 定义web服务器

|——home-node.js 定义home主页模块

|——htutil.js 定义工具模块,用于定义导航,以及网页模板替换方法,和获取http信息

|——mult-node.js 通过get方法获取参数信息,并执行加法

|——package.json 定义网站项目信息

  app-node.js代码:

var http_port = 8124;

var http = require('http');
var htutil = require('./htutil'); var server = http.createServer(function (req,res){
console.log("in server!");
htutil.loadParams(req,res,undefined);
if(req.requrl.pathname === '/'){
require('./home-node').get(req,res);
}else if(req.requrl.pathname === '/square'){
require('./square-node').get(req,res);
}else if(req.requrl.pathname === '/factorial'){
require('./factorial-node').get(req,res);
}else if(req.requrl.pathname === '/fibonacci'){
require('./fibonacci-node').get(req,res);
}else if(req.requrl.pathname === '/mult'){
require('./mult-node').get(req,res);
}else{
res.writeHead(404,{'Content-Type':'text/plain'});
res.end("bad url"+req.url);
}
}); server.listen(http_port);
console.log('listening to http://localhost:8124');

  home-node.js

var htutil = require('./htutil');
exports.get = function(req,res){
res.writeHead(200,{
'Content-Type':'text/html'
});
res.end(htutil.page("Math Wizard",
htutil.navbar(),
"<p>Math Wizard</p>"
));
}

  mult-node.js

var htutil = require("./htutil");
exports.get = function(req,res){
res.writeHead(200,{
'Content-Type':'text/html'
});
var result = req.a * req.b;
res.end(
htutil.page("Multiplication",htutil.navbar(),[
(!isNaN(req.a) && !isNaN(req.b)
?(
"<p class='result'>{a}*{b}={result}</p>"
.replace("{a}",req.a)
.replace("{b}",req.b)
.replace("{result}",req.a*req.b)
)
:""),
"<p>Enter numbers to multiply</p>",
"<form name='mult' action='/mult' method='get'>",
"A:<input type='text' name='a' /><br/>",
"B:<input type='text' name='b' /><br/>",
"<input type='submit' value='Submit' /></form>"
].join('\n'))
);
}

  htutil.js

var url = require('url');
//get url params a & b
exports.loadParams = function(req,res,next){
req.requrl = url.parse(req.url,true);
req.a = (req.requrl.query.a && !isNaN(req.requrl.query.a))
?new Number(req.requrl.query.a)
:NaN;
req.b = (req.requrl.query.b && !isNaN(req.requrl.query.b))
?new Number(req.requrl.query.b)
:NaN;
if(next) next();
}
//
exports.navbar = function(){
return ["<div class='navbar'>",
"<p><a href='/'>home</a></p>",
"<p><a href='/mult'>Multiplication</a></p>",
"<p><a href='/square'>Square's</a></p>",
"<p><a href='/factorial'>factorial's</a></p>",
"<p><a href='/fibonacci'>Fibonacci's</a></p>",
"</div>"
].join('\n');
}
//
exports.page = function(title,navbar,content){
return ["<html><head><title>{title}</title></head><body>",
"<td>{navbar}</td><td>{content}</td>",
"</tr></table></body></html>"
].join('\n')
.replace("{title}",title,"g")
.replace("{navbar}",navbar,"g")
.replace("{content}",content,"g");
}

  package.js

{
"name": "chap04",
"version": "1.0.0",
"description": "",
"main": "app-node.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}

  执行命令行:

node app-node.js

  访问http://localhost:8124,就可以访问到网址:

我的第一个Node web程序的更多相关文章

  1. Pycharm+Django搭建第一个Python Web程序

    1.安装django 无论是Python2.x还是Python3.x版本,都可以使用pip来安装Django.在控制台使用如下命令:pip install django 如: 2.检查dgango是否 ...

  2. 3.第一个Node.js程序:Hello World!

    转自:http://www.runoob.com/nodejs/nodejs-tutorial.html 以下是我们的第一个Node.js程序: console.log("Hello Wor ...

  3. NODE编程(三)--构建Node Web程序1

    一.HTTP服务器的基本知识 1.Node如何向开发者呈现HTTP请求 Node中的http模块提供了HTTP服务器和客户端接口: var http = require('http'); 创建HTTP ...

  4. 运行第一个Node.js程序

    初学Node.js,萌新一枚.感觉Node.js挺不错的,从基础开始一步一步来,加油吧! 我们来使用Node.js的express来运行第一个程序helloworld: 在命令提示符键入express ...

  5. 我的第一个Go web程序 纪念一下

    参考Go web编程,很简单的程序: 大致的步骤: 绑定ip和端口 绑定对应的处理器或者处理器函数,有下面两种选择,选择一种即可监听ip及端口 处理器: 定义一个struct结构体 然后让这个结构体实 ...

  6. 【基础知识】列一下一个.Net WEB程序员需要掌握的知识

    基础部分 C# 基础语法 OOP的概念,面向对象的理解 继承 封装 多态 ASP.NET MVC (Web Form 用的越来越少,如果你不熟悉,可以不看) JavaScript 基础语法 如何在HT ...

  7. 新建一个Java Web程序

    依次选择 File——New——Web——Dynamic Web Project 输入项目名称“MyWebProject”,选择好Apache Tomcat V9.0服务器,其他采用默认配置. 单击N ...

  8. 搭建java web开发环境、使用eclipse编写第一个java web程序

    开发工具:eclipse-jee-juno-SR2-win32-x86_64(请自行官网下载) 使用服务器:apache-tomcat-7.0.35-windows-x64(请自行官网下载) 打开 e ...

  9. NODE编程(四)--构建Node Web程序2

    四.提供静态文件服务 1.创建一个静态文件服务器 __dirname ,取值是该文件所在咋目录路径.分散在不同目录中的文件可以有不同的值. /** * 最进本的ReadStream静态文件服务器 */ ...

随机推荐

  1. Icacls 在windows目录文件授权中的应用

    前言 最近因工作需要,需要对批量服务器某一目录下的文件进行统一授权,对于linux来说,授权很方便,对于window来说,要对目录下的文件进行批量授权还是很不方便的,windows平台授权自然想到用i ...

  2. hadoop core-site.xml

    <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text ...

  3. web工程 所需是jar包总结

    commons-beanutils-1.8.3.jar : BeanUtils主要提供了对于JavaBean进行各种操作,需要Commons -Collections包和Commons -loggin ...

  4. [转]响应式网页设计:rem、em设置网页字体大小自适应

    本文转自:http://www.cnblogs.com/aimyfly/archive/2013/07/19/3200742.html 「rem」是指根元素(root element,html)的字体 ...

  5. 自定义input[type="radio"]的样式

    对于表单,input[type="radio"] 的样式总是不那么友好,在不同的浏览器中表现不一. 为了最大程度的显示出它们的差别,并且为了好看,首先定义了一些样式: <fo ...

  6. 关于TouchEvent里面的touches,targetTouches,changedTouches的解释

    touches:手指触摸到屏幕上引起的当前所有触摸点的集合; targetTouches:手指触摸到绑定事件的节点上的触摸点的集合; changedTouches:触摸事件时改变触摸点的集合;  以下 ...

  7. CSU 1060 Nearest Sequence

    题意:求三个序列的最长公共子序列. 思路:一开始以为只要求出前两个的LCS,然后和第三个再求一遍LCS就是答案了.但是样例就对我进行啪啪啪打脸了.实际上就跟两个序列的差不多,换成三维的就行了. 代码: ...

  8. as3 Point

    首先我们看看Point类的属性:x:Number——该点的水平坐标y:Number——该点的垂直坐标length:Number——从(0,0)到此点的线段长度(只读属性)从length属性我们可以看到 ...

  9. Android性能测试工具Emmagee介绍

    Emmagee介绍 Emmagee是监控指定被测应用在使用过程中占用机器的CPU.内存.流量资源的性能测试小工具.该工具的优势在于如同windows系统性能监视器类似,它提供的是数据采集的功能,而行为 ...

  10. maven中的 dependencies 和 dependencyManagement 的区别

    今天我在配置 sellercenter 的接口测试环境的时候,发现一些依赖的写法不太一致: 比如有的依赖的<scope>是写在子项目中的 <dependencies> 下的&l ...