zoukankan      html  css  js  c++  java
  • node.js Web应用框架Express.js(一)

    什么是Express.js

    Express 是一个简洁而灵活的 node.js Web应用框架, 提供一系列强大特性帮助你创建各种Web应用,提供丰富的HTTP工具以及来自Connect框架的中间件随取随用,创建强健、友好的API变得快速又简单,Express 不对 node.js 已有的特性进行二次抽象,只是在它之上扩展了Web应用所需的功能。

    开篇,这里就只做简单的介绍,整理一些有关express.js的资源,与大家一起学习

    Express.js中文社区:http://expressjs.jser.us/

    Express.js 中文入门指引手册:http://my.oschina.net/youdoce/blog/68476

    Nodejs开发框架Express3.0开发手记–从零开始:http://blog.fens.me/nodejs-express3/

    Expressjs中文平台:http://www.expressjs.com.cn/

    Node.js 入门: https://cnodejs.org/getstart

    csdn中博文expressjs教程:http://blog.csdn.net/chszs/article/details/8869655

    Node.js开发框架Express4.x:http://blog.fens.me/nodejs-express4/

    记住我们用node+express+bowser,是bower 进行下载依赖js需要先安装好git。

    express启动文件,app.js:

    // 加载依赖库,原来这个类库都封装在connect中,现在需地注单独加载
    var express = require('express'); 
    var path = require('path');
    var favicon = require('serve-favicon');
    var logger = require('morgan');
    var cookieParser = require('cookie-parser');
    var bodyParser = require('body-parser');
    
    // 加载路由控制
    var routes = require('./routes/index');
    //var users = require('./routes/users');
    
    // 创建项目实例
    var app = express();
    
    // 定义EJS模板引擎和模板文件位置,也可以使用jade或其他模型引擎
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'ejs');
    
    // 定义icon图标
    app.use(favicon(__dirname + '/public/favicon.ico'));
    // 定义日志和输出级别
    app.use(logger('dev'));
    // 定义数据解析器
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: false }));
    // 定义cookie解析器
    app.use(cookieParser());
    // 定义静态文件目录
    app.use(express.static(path.join(__dirname, 'public')));
    
    // 匹配路径和路由
    app.use('/', routes);
    //app.use('/users', users);
    
    // 404错误处理
    app.use(function(req, res, next) {
        var err = new Error('Not Found');
        err.status = 404;
        next(err);
    });
    
    // 开发环境,500错误处理和错误堆栈跟踪
    if (app.get('env') === 'development') {
        app.use(function(err, req, res, next) {
            res.status(err.status || 500);
            res.render('error', {
                message: err.message,
                error: err
            });
        });
    }
    
    // 生产环境,500错误处理
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: {}
        });
    });
    
    // 输出模型app
    module.exports = app;

    项目启动代码也被移到./bin/www的文件,www文件也是一个node的脚本,用于分离配置和启动程序,源码:

    #!/usr/bin/env node   
    
    /**
     * 依赖加载
     */
    var app = require('../app');
    var debug = require('debug')('nodejs-demo:server');
    var http = require('http');
    
    /**
     * 定义启动端口
     */
    var port = normalizePort(process.env.PORT || '3000');
    app.set('port', port);
    
    /**
     * 创建HTTP服务器实例
     */
    var server = http.createServer(app);
    
    /**
     * 启动网络服务监听端口
     */
    server.listen(port);
    server.on('error', onError);
    server.on('listening', onListening);
    
    /**
     * 端口标准化函数
     */
    function normalizePort(val) {
      var port = parseInt(val, 10);
      if (isNaN(port)) {
        return val;
      }
      if (port >= 0) {
        return port;
      }
      return false;
    }
    
    /**
     * HTTP异常事件处理函数
     */
    function onError(error) {
      if (error.syscall !== 'listen') {
        throw error;
      }
    
      var bind = typeof port === 'string'
        ? 'Pipe ' + port
        : 'Port ' + port
    
      // handle specific listen errors with friendly messages
      switch (error.code) {
        case 'EACCES':
          console.error(bind + ' requires elevated privileges');
          process.exit(1);
          break;
        case 'EADDRINUSE':
          console.error(bind + ' is already in use');
          process.exit(1);
          break;
        default:
          throw error;
      }
    }
    
    /**
     * 事件绑定函数
     */
    function onListening() {
      var addr = server.address();
      var bind = typeof addr === 'string'
        ? 'pipe ' + addr
        : 'port ' + addr.port;
      debug('Listening on ' + bind);
    }

    写烂了的node例子:

    var http = require("http"),
        open = require("child_process");
        
    console.log("启动httpserver服务");
    var server = http.createServer(function(req,res){
        res.writeHead(200,{"Content-Type":"text/html;charset=UTF-8"});
        res.write("开始
    ");
        res.end("我来了");
    });
    
    server.listen(3000,"127.0.0.1");
    open.exec("start http://127.0.0.1:3000");
    
    console.log("3000端口。")
    var net = require("net"),
        open = require("child_process");
    
    console.log("启动httpserver服务");
    
    var server = net.createServer(function(req,res){
    
        //设置请求编码
        socket.write("Echo server 
    ");
    })

     node 项目经常需要安装的模块在项目根目录进行安装:

    npm install express
    npm install jade
    npm install mongoose
    npm install bower -g
    bower install bootstrap

     经典教程:用 Express 4.0 重写《Node.js 开发指南》第5章的项目实例

  • 相关阅读:
    C# winform开发:Graphics、pictureBox同时画多个矩形
    C# “配置系统未能初始化” 异常解决
    Google Maps API V3 之 路线服务
    Google Maps API V3 之 图层
    Google Maps API V3 之绘图库 信息窗口
    Google 地图 API V3 之 叠加层
    驱动开发之libusb函数
    libusb的使用教程和例子
    libusb检测U盘插入
    使用libusb检测USB设备插拔状态
  • 原文地址:https://www.cnblogs.com/pingfan1990/p/4315596.html
Copyright © 2011-2022 走看看