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