我的第一个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程序,如需转载请自行联系原博主。

时间: 2024-11-02 03:58:22

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

《Node.js入门经典》一1.3 安装并创建第一个Node.js程序

1.3 安装并创建第一个Node.js程序 Node.js入门经典 说得够多的了!现在来看看运行中的Node.js并编写你的第一个Node.js程序.首先得安装 Node.js.用于Windows 和 OSX 的安装程序可以在 Node.js 的主页下载:http://nodejs.org/.要想在这些平台上安装Node.js,只需下载相关文件并双击安装程序即可.如果使用Linux或者想手动编译Node.js,请在https://github.com/joyent/node/wiki/insta

java web-如何将一个Java Web程序包装成一个c/s程序?

问题描述 如何将一个Java Web程序包装成一个c/s程序? 假如现有一个Java Web程序,如何用C++/C#代码将此程序包装成一个客户端程序? 解决方案 一个简单的C/S 架构程序 解决方案二: 其实可以用编程语言编写一个外框,在外框里面加载相应的页面即可.具体你可以看下硕鼠这个软件..他们好像就是这么做的 解决方案三: 你用C#建立一个WinForm应用程序,然后窗体中使用WebBrowser来链接你 Java Web页面就可以啦

构建一个Node.js应用程序分析公众对Twitter给定主题的反应

作为一位软件应用程序开发人员,我尝试过解决以下问题:如何获得来自用户的直接反馈,尤其是在线用户.举例而言,迅速了解 Twitter 用户对一个应用程序.产品发布.活动或当前事件的反应将会很有帮助.反应是正面.负面还是中立的? 由于我希望应用程序能够快速判定 Twitter 上的公众情绪,所以我希望它能够快速开发,连接一个 Twitter Web 服务,拥有一个简单的移动接口,并快速分析海量数据. 我选择使用 JavaScript 和流行的 Node.js 运行时构建 PaaS 应用程序,将它构建

如何使用Docker部署一个Go Web应用程序

本文讲的是如何使用Docker部署一个Go Web应用程序,[编者的话]这是国外轻量级CJ厂商Semaphore发布的教程,旨在让开发人员如何借助于Docker让Go应用程序的编译及发动实现自动化,提升开发效率的同时也能保证软件部署的可靠性. 熟悉Docker如何提升你在构建.测试并部署Go Web应用程序的方式,并且理解如何使用Semaphore来持续部署. 简介 大多数情况下Go应用程序被编译成单个二进制文件,web应用程序则会包括模版和配置文件.而当一个项目中有很多文件的时候,由于很多文件

javaweb-java web程序中,如何加载一个keystore 文件??(keystore文件在项目中)

问题描述 java web程序中,如何加载一个keystore 文件??(keystore文件在项目中) 比如我有一个xx.keystore 如果是java 程序的话,用file file=new file("文件路径"): 一定可以. 但是web'程序如何加载???求解...先在这里谢谢了. 解决方案 请问楼主问的是Https加载证书的例子?

mysql-用MySQL运行了一个maven ssm程序框架到web上,求位大神告诉我这是什么错误?谢谢!

问题描述 用MySQL运行了一个maven ssm程序框架到web上,求位大神告诉我这是什么错误?谢谢! [com.alibaba.druid.pool.DruidDataSource]create connection error java.sql.SQLException: Access denied for user 'sypro'@'localhost' (using password: YES) at com.mysql.jdbc.SQLError.createSQLException

一个c#为后台的web程序,用的sqlserver数据库,如何架构到云平台上

问题描述 一个c#为后台的web程序,用的sqlserver数据库,打算如何架构到云平台上,构建一个图形服务器.视频服务器和数据库的分布式,有什么解决方案,大牛们给些建议,做好能给以个类似淘宝的云平台解决方案,先谢谢了! 解决方案

主管给了我一个C写的.dll要求我的Web程序能对接,与单片机交互,怎么办

问题描述 求高手解答啊``我找份工作真的不容易啊 解决方案 解决方案二:在客户端调用还是在服务器调用?要是客户端你就得写activex包装一下dll解决方案三:怎么写啊解决方案四:是不是直接在.net环境中web程序目录下添加引用,然后调用dll里面的接口就可以了.解决方案五:用VC新建一个ATL工程,然后添加对象,按照向导来就可以了.

web程序运行,浏览器弹出一个提示null的弹出框,但是控制台没有报错

问题描述 web程序运行,浏览器弹出一个提示null的弹出框,但是控制台没有报错 如题web程序运行,浏览器弹出一个提示null的弹出框,但是控制台没有报错 解决方案 浏览器弹窗肯定是你的js中写了alert()了,而且你的弹出的内容为空 解决方案二: 看看那里弹出来的!一步步调试跟踪下! 解决方案三: 肯定是你哪里写了alert了,只能调试跟踪了