美文网首页
从零开始学习nodejs

从零开始学习nodejs

作者: 心淡然如水 | 来源:发表于2019-10-08 08:29 被阅读0次

    官网下载node安装包全局安装

    我的系统环境

    Mac 0.11.6

    Nodejs:v6.7.0n

    Npm:3.10.7

    1.首先,我们需要安装express库。在Express3.6.x之前的版本,Express需要全局安装的,项目构建器模块是合并在Express项目中的,后来这个构建器被拆分出来,独立成为了一个项目express-generator,现在我们只需要全局安装express-generator项目就行了。

    终端执行:

    npm install -g express-generator@4  #全局安装-g

    express -e nodejs-demo  # 创建项目

    cd nodejs-demo && npm install

    npm start

    2. 目录结构

    接下来,我们详细看一下Express4项目的结构、配置和使用。

    bin, 存放启动项目的脚本文件

    node_modules, 存放所有的项目依赖库。

    public,静态文件(css,js,img)

    routes,路由文件(MVC中的C,controller)

    views,页面文件(Ejs模板)

    package.json,项目依赖配置及开发者信息

    app.js,应用核心配置文件

    3. package.json项目配置

    package.json用于项目依赖配置及开发者信息,scripts属性是用于定义操作命令的,可以非常方便的增加启动命令,比如默认的start,用npm start代表执行node ./bin/www命令。

    查看package.json文件。

    {

    "name": "express4-demo",

    "version": "0.0.0",

    "private": true,

    "scripts": {

           "start": "node ./bin/www"

    },

    "dependencies": {

         "body-parser": "~1.10.2",

         "cookie-parser": "~1.3.3",

          "debug": "~2.1.1",

          "ejs": "~2.2.3",

          "express": "~4.11.1",

            "morgan": "~1.5.1",

           "serve-favicon": "~2.2.0"

         }

    }

    4. 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;

    我们看到在app.js中,原来调用connect库的部分都被其他的库所代替,serve-favicon、morgan、cookie-parser、body-parser,默认项目中,只用到了最基本的几个库,还没有其他需要替换的库,在本文最后有详细列出。

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

    查看./bin/www文件。

    #!/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);

    }

    相关文章

      网友评论

          本文标题:从零开始学习nodejs

          本文链接:https://www.haomeiwen.com/subject/uxeauttx.html