• Nodejs 学习笔记


    一、基础

    1、exports是模块公开的接口,require用于从外部获取一个模块的接口,即所获取模块的exports对象,

    2、对象从原型中继承:util.inherits(Sub, Base);

    3、util.inspect(object,[showHidden],[depth],[colors])是一个将任意对象转换为字符串的方法,通常用于调试和错误输出。

    二、事件及监听

    1、events 模块只提供了一个对象: events.EventEmitter。对于每个事件,EventEmitter 支持若干个事件监听器。当事件发射时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。

    2、EventEmitter常用的API:

    ①EventEmitter.on(event, listener) 为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数 listener。
    ②EventEmitter.emit(event, [arg1], [arg2], [...]) 发射 event 事件,传递若干可选参数到事件监听器的参数表。
    ③EventEmitter.once(event, listener) 为指定事件注册一个单次监听器,即监听器最多只会触发一次,触发后立刻解除该监听器。
    ④EventEmitter.removeListener(event, listener) 移除指定事件的某个监听器,listener 必须是该事件已经注册过的监听器。
    ⑤EventEmitter.removeAllListeners([event]) 移除所有事件的所有监听器,如果指定 event,则移除指定事件的所有监听器。

    三、文件操作

    文件系统fs中的操作都提供了同步和异步两个版本,

    fs.readFile(filename,[encoding],[callback(err,data)])       fs.readFileSync(filename, [encoding])

    fs.open(path, flags, [mode], [callback(err, fd)])

    fs.read(fd, buffer, offset, length, position, [callback(err, bytesRead,buffer)])

    四、HTTP服务

    1、http.Server 的事件

    ①request:当客户端请求到来时,该事件被触发,提供两个参数 req 和res,分别是http.ServerRequest 和 http.ServerResponse 的实例,表示请求和响应信息。
    ②connection:当 TCP 连接建立时,该事件被触发,提供一个参数 socket,为net.Socket 的实例。connection 事件的粒度要大于 request,因为客户端在Keep-Alive 模式下可能会在同一个连接内发送多次请求。
    ③close :当服务器关闭时,该事件被触发。注意不是在用户连接断开时。

    2、手动解析GET请求参数,使用url模块中的parse函数

    五、HTTP客户端

    1、app会解析请求的路径,调用相应的逻辑。app.js中有一行内容是app.get('/', routes.index),它的作用是规定路径为“/”的GET请求由routes.index函数处理。
    2、routes.index通过res.render('index', { title: 'Express' }) 调用视图模板 index,传递 title变量。
    3、如何创建路由规则:
    ①打开 app.js,在已有的路由规则 app.get('/', routes.index) 后面添加一行:
    app.get('/hello', routes.hello);
    ②修改 routes/index.js,增加 hello 函数:
    /*
    * GET home page.
    */
    exports.index = function(req, res) {
    res.render('index', { title: 'Express' });
    };
    exports.hello = function(req, res) {
    res.send('The time is ' + new Date().toString());
    };
    app.get 是路由规则创建函数,它接受两个参数,第一个参数是请求的路径,第二个参数是一个回调函数,该路由规则被触发时调用回调函数,其参数表传递两个参数,分别是 req和 res, 表示请求信息和响应信息。
    4、路径匹配
    高级路径匹配模式
    eg,展示一个用户的个人页面,路径为/user/[username],
    app.get('/user/:username', function(req, res) {
    res.send('user: ' + req.params.username);
    });
    5、表征状态转移(Representational State Transfer)
    Express 支持的 HTTP 请求的绑定函数
    请求方式 绑定函数
    GET app.get(path, callback)
    POST app.post(path, callback)
    PUT app.put(path, callback)
    DELETE app.delete(path, callback)
    PATCH app.patch(path, callback)
    TRACE app.trace(path, callback)
    CONNECT app.connect(path, callback)
    OPTIONS app.options(path, callback)
    所有方法 app.all(path, callback)
    6、使用 next() 转移控制权,
    7、针对一个用户查询信息和修改信息的操作,分别对应了 GET 和 PUT 操作,而两者共有的一个步骤是检查用户名是否合法,因此可以通过 next() 方法实现。
    var users = {
    'byvoid': {
    name: 'Carbo',
    website: 'http://www.byvoid.com'
    }
    };
    app.all('/user/:username', function(req, res, next) {
    // 检查用户是否存在
    if (users[req.params.username]) {
    next();
    } else {
    next(new Error(req.params.username + ' does not exist.'));
    }
    });
    app.get('/user/:username', function(req, res) {
    // 用户一定存在,直接展示
    res.send(JSON.stringify(users[req.params.username]));
    });
    app.put('/user/:username', function(req, res) {
    // 修改用户信息
    res.send('Done');
    });
    六、模板引擎
    res.render 的功能是调用模板引擎,并将其产生的页面直接返回给客户端。它接受两个参数,第一个是模板的名称,即 views 目录下的模板文件名,不包含文件的扩展名;第二个参数是传 递给模板的数据,用于模板翻译。
    1、ejs
    ejs 的标签系统:
    ①<% code %>:JavaScript 代码。
    ②<%= code %>:显示替换过 HTML 特殊字符的内容。
    ③<%- code %>:显示原始 HTML 内容。
    2、关闭页面布局模板
    在 app.js 的中 app.configure 中添加以下内容,这样页面布局功能就被关闭了。
    app.set('view options', {
    layout: false
    });
    3、设计用资源Twitter Bootstrap
    http://twitter.github.com/bootstrap/
    http://jquery.com/
    4、req.flash 是 Express 提供的一个奇妙的工具,通过它保存的变量只会在用户当前和下一次的请求中被访问,之后会被清除,通过它我们可以很方便地实现页面的通知和错误信息显示功 能。
    七、Nodejs进阶话题
    1、加载顺序
    下面总结一下使用 require(some_module) 时的加载顺序。
    (1) 如果some_module 是一个核心模块,直接加载,结束。
    (2) 如果some_module以“ / ”、“ ./ ”或“ ../ ”开头,按路径加载 some_module,结束。
    (3) 假设当前目录为 current_dir,按路径加载 current_dir/node_modules/some_module。
     如果加载成功,结束。
     如果加载失败,令current_dir为其父目录。
     重复这一过程,直到遇到根目录,抛出异常,结束。
    2、采用产品模式运行
    通过NODE_ENV=productionnode app.js命令运行服务器可以看到:
    Express server listening on port 3000 in production mode
    3、启动脚本
    #! /bin/sh
    NODE_ENV=production
    DAEMON="node cluster.js"
    NAME=Microblog
    DESC=Microblog
    PIDFILE="microblog.pid"
    case "$1" in
    start)
    echo "Starting $DESC: "
    nohup $DAEMON > /dev/null &
    echo $! > $PIDFILE
    echo "$NAME."
    ;;
    stop)
    echo "Stopping $DESC: "
    pid='cat $PIDFILE'
    kill $pid
    rm $PIDFILE
    echo "$NAME."
    ;;
    esac
    exit 0

    启动:./microblog start
    关闭:./microblog stop

    可以实现服务器的开机自动启动了,根据不同的操作系统,将其加入启动运行项即可,唯一需要修改的地方是DAEMON 和PIDFILE 应该写成绝对路径,以便在不同的目录下运行。
    4、共享80 端口
    以Nginx为例,介绍如何通过反向代理实现Node.js 虚拟主机。
    server {
    listen 80;
    server_name mysite.com;
    location / {
    proxy_pass http://localhost:3000;
    }
    }
    在添加了虚拟主机以后,还可以在Nginx配置文件中添加访问静态文件的规则(具体请参考Nginx文档),删去app.js 中的app.use(express.static(__dirname + '/public'));。这样可以直 接让Nginx 来处理静态文件,减少反向代理以及Node.js 的开销。

  • 相关阅读:
    【SPI】浅谈JDK中SPI技术
    【MySQL8.0.18】阿里云服务器上搭建MySQL数据库
    【JDK13】阿里云服务器安装JDK13
    小型个人博客搭建之数据库设计
    【算法题】CCF CSP第三题练习(更新中)
    【算法题】CCF CSP第一题练习
    【嵌入式】KEIL4和KEIL5合并
    【ROS】安装ubuntu18.04+ros-melodic
    Notepad++配置python之NppExec
    vi一般指令命令行
  • 原文地址:https://www.cnblogs.com/1394htw/p/9599065.html
Copyright © 2020-2023  润新知