我的第一个Node web程序

简介:

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,就可以访问到网址:

本文转自博客园xingoo的博客,原文链接:我的第一个Node web程序,如需转载请自行联系原博主。
相关文章
|
2月前
|
安全 测试技术 数据库
维护的Web应用程序
【10月更文挑战第4天】维护的Web应用程序
48 4
|
2月前
|
开发框架 JavaScript 前端开发
使用 Node.js 和 Express 构建 Web 应用
【10月更文挑战第2天】使用 Node.js 和 Express 构建 Web 应用
|
27天前
|
数据可视化 数据库 开发者
使用Dash构建交互式Web应用程序
【10月更文挑战第16天】本文介绍了使用Python的Dash框架构建交互式Web应用程序的方法。Dash结合了Flask、React和Plotly等技术,让开发者能够快速创建功能丰富的数据可视化应用。文章从安装Dash开始,逐步介绍了创建简单应用程序、添加交互元素、部署应用程序以及集成更多功能的步骤,并提供了代码示例。通过本文,读者可以掌握使用Dash构建交互式Web应用程序的基本技巧和高级功能。
42 3
|
1月前
|
JavaScript 前端开发 持续交付
构建现代Web应用:Vue.js与Node.js的完美结合
【10月更文挑战第22天】随着互联网技术的快速发展,Web应用已经成为了人们日常生活和工作的重要组成部分。前端技术和后端技术的不断创新,为Web应用的构建提供了更多可能。在本篇文章中,我们将探讨Vue.js和Node.js这两大热门技术如何完美结合,构建现代Web应用。
30 4
|
2月前
|
JavaScript 前端开发
如何使用Vue.js构建响应式Web应用程序
【10月更文挑战第9天】如何使用Vue.js构建响应式Web应用程序
|
2月前
|
前端开发 JavaScript 测试技术
构建响应式Web应用程序:React实战指南
【10月更文挑战第9天】构建响应式Web应用程序:React实战指南
|
2月前
|
存储 JavaScript 前端开发
如何使用React和Redux构建现代化Web应用程序
【10月更文挑战第4天】如何使用React和Redux构建现代化Web应用程序
|
2月前
|
设计模式 测试技术 持续交付
开发复杂Web应用程序
【10月更文挑战第3天】开发复杂Web应用程序
39 2
|
2月前
|
JavaScript 应用服务中间件 Apache
Node.js Web 模块
10月更文挑战第7天
31 0
|
6月前
|
JavaScript 前端开发 安全
怎样用Node.js搭建web服务器
本文探讨了如何使用Node.js构建高效的HTTP服务器。首先,介绍了HTTP常见请求方法,如GET、POST、PUT等。接着,展示了如何使用Node.js的`http`模块创建服务器,并根据请求方法进行不同处理,如判断GET和POST请求,以及获取GET请求参数和处理POST请求数据。最后,讨论了服务器代码的模块化管理,包括路由管理和业务逻辑拆分,以提升代码的维护性和扩展性。通过本文,读者可以掌握基础的Node.js服务器开发及模块化设计技巧。
下一篇
无影云桌面