Node.js 初心
<h1 id="官方文档">官方文档</h1><p>https://nodejs.org/dist/latest-v12.x/docs/api/</p>
<h1 id="非官方中文网">非官方中文网</h1>
<p>http://nodejs.cn/<br>
http://nodejs.cn/api/</p>
<h1 id="安装nodejs">安装Node.js</h1>
<p>使用snapd安装,非常方便。参考上一篇安装Vue-CLI教程。<br>
通过snapd安装Node.js最好执行一步额外的操作,这是snap特殊的启动脚本造成的:</p>
<pre><code>npm config set scripts-prepend-node-path true
</code></pre>
<p>正如上一篇教程所做的那样,如果不配置<code>scripts-prepend-node-path</code>为true,很多时候都要添加一个<code>--scripts-prepend-node-path</code>参数,非常麻烦。</p>
<h1 id="初始化项目">初始化项目</h1>
<pre><code>mkdir example-project
cd example-project
npm init -y
</code></pre>
<p>产生一个package.json,大致如下,其中scripts是<code>npm run $script</code>的自定义集合:</p>
<pre><code>{
"name": "hello",
"version": "1.0.0",
"description": "我的第一个Node.js程序",
"main": "app.js",
"scripts": {
"test": "node app.js"
},
"author": "",
"license": "ISC"
}
</code></pre>
<p>现在编辑文件app.js,开始写入我们的第一个Node.js项目代码</p>
<pre><code class="language-JavaScript">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}`)
})
</code></pre>
<p>执行<code>npm run test</code>,访问服务器!</p>
<pre><code>$ 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
</code></pre>
<p>在npm后台可以看到</p>
<pre><code>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'
]
</code></pre>
<p>这些都是request(原型req.__proto__为IncomingMessage)的字段,是不是比在官网查方便多了?<br>
当然,我更想进一步了解这些字段是什么东西</p>
<pre><code class="language-JavaScript"> for (key in req) {
let value = req
if (typeof value === "function") {
console.log(`${key} => FUNCTION`)
break
}
try {
console.log(`${key} => ${value}`)
} catch(e) {
console.log(`can't read the ${key} value`)
}
}
</code></pre>
<p>输出:</p>
<pre><code>_readableState =>
readable => true
can't read the _events value
_eventsCount => 1
_maxListeners => undefined
socket =>
httpVersionMajor => 1
httpVersionMinor => 1
httpVersion => 1.1
complete => false
headers =>
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 =>
rawTrailers =>
aborted => false
upgrade => false
url => /
method => GET
statusCode => null
statusMessage => null
client =>
_consuming => false
_dumped => false
setTimeout => FUNCTION
</code></pre>
<h1 id="安装模块">安装模块</h1>
<pre><code>npm i --save express
</code></pre>
<p>现在,依赖模块已经被安装到node_modules文件夹下,package.json中的dependencies字段也被更新了</p>
<h1 id="nodejs作为脚本执行">node.js作为脚本执行</h1>
<p>新建index.js</p>
<pre><code>#!/usr/bin/env node
console.log("Hello, Node.js")
</code></pre>
<p>现在执行<code>./index.js</code>,系统就能自动调用node环境来解释运行index.js了</p>
<p>Node.js就是这么的强大又简单,Be enjoy IT !</p>
<h1 id="模块内置对象和函数">模块、内置对象和函数</h1>
<p>每个.js文件都可以看作一个小模块,它们都是一个render函数的实现,这个函数原型是</p>
<pre><code>function (exports, require, module, __filename, __dirname) {; /* module body */; });
</code></pre>
<p>其中exports是module.exports的引用。要导出函数和对象,直接重写module.exports对象即可。<br>
不过除了这些参数,我们还可以使用全局对象global,比如对象<code>global.process.env</code>可以访问环境变量。</p>
<ul>
<li>require()函数<br>
require()函数可以加载模块和json文件<br>
什么叫加载模块?事实上,require()函数返回的就是render()函数的回调参数module的exports字段。<br>
要从当前目录加载模块和json文件,路径必须以./开头,文件后缀.js或.json可以省略。</li>
</ul>
<pre><code>const log = require("./log")
const config = require("./config.json")
</code></pre>
<p>END</p><br><br>
来源:https://www.cnblogs.com/develon/p/12013334.html
頁:
[1]