• Node.js 初心


    官方文档

    https://nodejs.org/dist/latest-v12.x/docs/api/

    非官方中文网

    http://nodejs.cn/
    http://nodejs.cn/api/

    安装Node.js

    使用snapd安装,非常方便。参考上一篇安装Vue-CLI教程。
    通过snapd安装Node.js最好执行一步额外的操作,这是snap特殊的启动脚本造成的:

    npm config set scripts-prepend-node-path true
    

    正如上一篇教程所做的那样,如果不配置scripts-prepend-node-path为true,很多时候都要添加一个--scripts-prepend-node-path参数,非常麻烦。

    初始化项目

    mkdir example-project
    cd example-project
    npm init -y
    

    产生一个package.json,大致如下,其中scripts是npm run $script的自定义集合:

    {
      "name": "hello",
      "version": "1.0.0",
      "description": "我的第一个Node.js程序",
      "main": "app.js",
      "scripts": {
        "test": "node app.js"
      },
      "author": "",
      "license": "ISC"
    }
    

    现在编辑文件app.js,开始写入我们的第一个Node.js项目代码

    const http = require("http")
    const config = { 
            host: "0.0.0.0",
            port: 80, 
    }
    
    const server = http.createServer((req, res) => {
            let values = []
            for (key in req) {
                    vars.push(key)
            }   
            console.log(values)
            res.write("<h1>Hello, Node.js</h1>")
            res.end()
    })
    
    server.listen(config.port, config.host, error => {
            console.log(`HTTP Server starting on ${config.host}:${config.port}`)
    })
    

    执行npm run test,访问服务器!

    $ curl localhost -v
    * Rebuilt URL to: localhost/
    *   Trying 127.0.0.1...
    * TCP_NODELAY set
    * Connected to localhost (127.0.0.1) port 80 (#0)
    > GET / HTTP/1.1
    > Host: localhost
    > User-Agent: curl/7.58.0
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    < Date: Mon, 09 Dec 2019 13:40:00 GMT
    < Connection: keep-alive
    < Transfer-Encoding: chunked
    <
    * Connection #0 to host localhost left intact
    

    在npm后台可以看到

    HTTP Server starting on 0.0.0.0:80
    [
      '_readableState',      'readable',         '_events',
      '_eventsCount',        '_maxListeners',    'socket',
      'httpVersionMajor',    'httpVersionMinor', 'httpVersion',
      'complete',            'headers',          'rawHeaders',
      'trailers',            'rawTrailers',      'aborted',
      'upgrade',             'url',              'method',
      'statusCode',          'statusMessage',    'client',
      '_consuming',          '_dumped',          'setTimeout',
      '_read',               'destroy',          '_addHeaderLines',
      '_addHeaderLine',      '_dump',            '_undestroy',
      '_destroy',            'push',             'unshift',
      'isPaused',            'setEncoding',      'read',
      'pipe',                'unpipe',           'on',
      'addListener',         'removeListener',   'off',
      'removeAllListeners',  'resume',           'pause',
      'wrap',                'setMaxListeners',  'getMaxListeners',
      'emit',                'prependListener',  'once',
      'prependOnceListener', 'listeners',        'rawListeners',
      'listenerCount',       'eventNames'
    ]
    

    这些都是request(原型req.__proto__为IncomingMessage)的字段,是不是比在官网查方便多了?
    当然,我更想进一步了解这些字段是什么东西

            for (key in req) {
                    let value = req[key]
                    if (typeof value === "function") {
                            console.log(`${key} => FUNCTION`)
                            break
                    }
                    try {
                            console.log(`${key} => ${value}`)
                    } catch(e) {
                            console.log(`can't read the ${key} value`)
                    }
            }
    

    输出:

    _readableState => [object Object]
    readable => true
    can't read the _events value
    _eventsCount => 1
    _maxListeners => undefined
    socket => [object Object]
    httpVersionMajor => 1
    httpVersionMinor => 1
    httpVersion => 1.1
    complete => false
    headers => [object Object]
    rawHeaders => Host,a,User-Agent,Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0,Accept,text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,Accept-Language,zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2,Accept-Encoding,gzip, deflate,Connection,keep-alive,Upgrade-Insecure-Requests,1,Cache-Control,max-age=0
    trailers => [object Object]
    rawTrailers =>
    aborted => false
    upgrade => false
    url => /
    method => GET
    statusCode => null
    statusMessage => null
    client => [object Object]
    _consuming => false
    _dumped => false
    setTimeout => FUNCTION
    

    安装模块

    npm i --save express
    

    现在,依赖模块已经被安装到node_modules文件夹下,package.json中的dependencies字段也被更新了

    node.js作为脚本执行

    新建index.js

    #!/usr/bin/env node
    
    console.log("Hello, Node.js")
    
    

    现在执行./index.js,系统就能自动调用node环境来解释运行index.js了

    Node.js就是这么的强大又简单,Be enjoy IT !

    模块、内置对象和函数

    每个.js文件都可以看作一个小模块,它们都是一个render函数的实现,这个函数原型是

    function (exports, require, module, __filename, __dirname) {; /* module body */; });
    

    其中exports是module.exports的引用。要导出函数和对象,直接重写module.exports对象即可。
    不过除了这些参数,我们还可以使用全局对象global,比如对象global.process.env可以访问环境变量。

    • require()函数
      require()函数可以加载模块和json文件
      什么叫加载模块?事实上,require()函数返回的就是render()函数的回调参数module的exports字段。
      要从当前目录加载模块和json文件,路径必须以./开头,文件后缀.js或.json可以省略。
    const log = require("./log")
    const config = require("./config.json")
    

    END

  • 相关阅读:
    centos6系列更换阿里yum源
    javascript字符串方法学习汇总
    ORA-01439:要更改数据类型,则要修改的列必须为空
    Python之字典
    Python之元组
    Python之列表
    Tensorflow 快速学习
    Ubuntu 切换到root 授权失败
    受限玻尔兹曼机二
    Numpy 数组ndarray和常用函数速查
  • 原文地址:https://www.cnblogs.com/develon/p/12013334.html
Copyright © 2020-2023  润新知