Node.js 教程:边运行边学
免费的 Node.js 教程,示例都能在页面上直接运行:文件、模块、事件循环、可以发送请求的 Express 服务器、MongoDB 和 JWT。修改代码,再运行一次就能看到结果。
开始课程入门
- Node.js 是什么Node.js 是一个运行时,能在浏览器之外运行 JavaScript,比如在服务器上和终端里。它不是一门语言,也不是一个框架:它由 V8、事件循环,以及操作文件、网络和进程的 API 组成。
- Node.js 与 JavaScriptJavaScript 是一门语言;Node.js 是在浏览器之外运行它的程序。两者的语法完全相同,但包围你代码的全局对象和内置 API 不一样。
- process.argvprocess.argv 是一个数组,保存着启动你程序的那条命令行:node 可执行文件、脚本路径,然后是你输入的每个参数。用 process.argv.slice(2) 就能只拿到你自己的参数。
- process.envprocess.env 是一个对象,保存着 Node.js 程序启动时拿到的环境变量。每个值要么是字符串,要么是 undefined,所以数字和布尔值需要你自己转换,并且每个变量都应该有默认值。
- 读取用户输入Node.js 没有 prompt() 函数。要在终端里向用户提问,在 process.stdin 上创建一个 readline 接口并调用 question(),或者用 readline/promises 来 await 它。
模块
文件与路径
- fs.readFile在 Node.js 中用 fs.readFile(回调)、fs.readFileSync 或 fs/promises 的 await readFile 读取文件。传入 'utf8' 得到字符串,文件不存在时处理 ENOENT。
- fs.writeFile在 Node.js 中用 fs.writeFile、fs.writeFileSync 或 fs/promises 的 await writeFile 写入文件。文件不存在时会被创建,已存在时会被替换;要追加到末尾,请用 appendFile。
- fs/promisesfs/promises 是 Node fs 模块的 Promise 版本:readFile、writeFile、readdir、stat、mkdir、rm 和 rename 都返回可以 await 的 Promise,错误用 try/catch 捕获。
- path 模块path 模块按照操作系统的规则拼接和拆分文件路径。path.join 把路径片段拼在一起;path.resolve 则从当前文件夹开始,把它们变成一个绝对路径。
Node 异步编程
HTTP 与 Express
- HTTP 服务器`http.createServer()` 接收一个函数,每个请求到来时都会带着 `req` 和 `res` 运行它。你从 `req` 中读取请求方法和 URL,然后在 `res` 上设置状态码、响应头和响应体,再调用 `res.end()`。
- Express 路由Express 中的一个路由由请求方法、路径和处理函数组成:`app.get('/users/:id', handler)`。把相关的路由放进一个 `express.Router()`,再用 `app.use('/api', router)` 挂载到某个前缀下。
- Express 中间件Express 中间件是一个在路由处理函数之前运行的函数 `(req, res, next)`。它可以读取或修改请求,用一个响应结束请求,或者调用 `next()` 把请求继续往下传。
- req.params、query、body`req.params` 保存路径中的命名部分(`/users/:id`),`req.query` 保存查询字符串(`?sort=new`),`req.body` 保存解析后的请求体;在你添加 `express.json()` 这类请求体解析器之前,它是 `undefined`。
- 错误处理Express 的错误处理器是一个有四个参数 `(err, req, res, next)` 的中间件,注册在所有路由之后。Express 5 会把抛出的错误、`next(err)` 调用以及 async 处理函数中被拒绝的 Promise 都交给它。
- express.static`app.use(express.static(path.join(__dirname, 'public')))` 会在对应的 URL 上提供 `public` 文件夹中的每个文件:`public/style.css` 响应 `/style.css`。加上挂载路径,就能把它们放在某个前缀下。
- Express 中的 CORSCORS 报错的意思是:响应没有允许页面所在的源,所以浏览器阻止了页面读取你的 API 响应。要在服务器端解决:发送 `Access-Control-Allow-Origin`,并响应预检 `OPTIONS` 请求,可以手写,也可以用 `cors` 包。