Node.js 学习笔记

这篇学习笔记是参考廖雪峰的JavaScript教程而总结的
链接: 廖雪峰JavaScript教程

Web开发

模块

在Node环境中,一个.js文件就称之为一个模块(module)。

使用模块的好处:

  • 最大的好处就是大大提高了代码的可维护性。
  • 其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其它地方引用。
  • 使用模块还可以笔迷函数名和变量名冲突。相同名字的函数和变量完全可以给分别存在不同的模块中。

模块的暴露和调用

  1. 模块暴露:module.exports = variable;
  • 输出的变量可以是任意对象,函数,数组等。

若在hello.js中,有如下代码:

1
module.exports = greet;

greet函数作为模块的输出暴露出去,这样其他模块就可以使用暴露出greet函数了。

  1. 模块调用:var variable = require('other_module');

    在用require()引入模块的时候,注意模块的相对路径

main.js:

1
var greet = require('./hello');

引入的模块作为变量保存在greet变量中。而greet变量就是在hello.js中用module.exports = greet;输出的greet函数。

深入了解模块原理

Koa

  • Environment:

    • node.js version: >=7.2
  • package.json

    • "koa": "2.0.0"
    • koa-router": "7.0.0" 用于处理URL
    • "koa-bodyparser": "3.2.0": 处理post请求,解析request的body的功能
    • ·app.use()`: 用于注册中间件,即将Generator函数放入中间件数组

处理url(koa-router)

正常情况下,我们应该对不同的URL调用不同的处理函数,这样才能返回不同的结果。
为了处理URL,我们需要引入koa-router这个middleware,让它负责处理URL映射。

编写REST API

async函数(middleware):

koa把很多async函数组成一个处理链,每个async函数都可以做一些自己的事情,然后用await next()来调用下一async函数。我们把每个async函数视为middleware。这些middleware可以组合起来,完成很多有用的功能。

middleware的顺序很很重要。

koa-router(middleware):

koa-router用于负责处理URL映射

我们使用router.get('/path', async fn)来注册一GET请求。可以在请求路径中使用变量,变量可以通过ctx.params.name访问。

ctx.params.id:

如果API路径带有参数,参数必须用:表示,例如DELETE /api/products/:id,客户端传递的URL可能就是/api/products/A001,参数id对应的值就是A001,要获得这个参数,我们用ctx,params.id

类似的,如果API路径有多个参数,例如/api/products/:pid/reviews/:rid,则这两个参数分别用ctx.parma.pidctx.params.rid获取。

这个功能由koa-router这个middleware提供。

注意,API路径的参数永远是字符串。

()语法:
1
const router = require('koa-router')();

相当于

1
2
const fn_router = require('koa-route');
const router = fn_router();

导入koa-router的语句最后的()是函数调用

koa-bodyparser(middleware):

这个middleware所解决的问题:用post请求处理URL时,post请求通常发送的表单或者JSON,它作为request的body发送,但是Node.js和koa提供的request对象,都不提供解析request的body的功能。

koa-bodyparser用于解析原始request请求。

这个koa-bodyparser必须在router之前被注册到app对象上。

在koa中的处理REST请求中,这个middleware可以解析请求的JSON数据并绑定到ctx.request.body上,输出JSON时我们先指定ctx.response.type = 'application/json,然后把JavaScript对象赋值给ctx.response.body就完成了REST请求的处理

因此,如果客户端传递了JSON格式的数据(例如,POST请求),则async函数可以通过ctx.request.body直接访问已经反序列化的JavaScript对象。这是由bodyParser()这个middleware完成的。如果ctx.request.bodyundefined,说明缺少middleware,或者middleware没有正确配置。

rest.js把所有关于REST API的输出统一到一个/api前缀的url。

api.js中对API的操作进行处理。如GET, POST, DELETE请求

最后,调到package.json所在目录,然后输入指令$npm install安装各个依赖项。接着就可以$npm start进行启动了

Node.js基本模块:

  • fs:
  • url:
  • http:
  • path: 根据操作系统处理相关文件路径

HTTP

request 对象封装了HTTP请求,我们调用request对象的属性和方法就可以拿到所有HTTP请求的信息。

response对象封装了HTTP相应,我们操作response对象的方法,就可以把HTTP响应返回给浏览器。

Get和Post方法的区别

  • Get提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连。如EditPosts.aspx?name=test&id=12345。Post方法是提交的数据放在HTTP包的Body中。

因为现在实习做着的项目之一是用node来处理后端数据,所以这篇文章应该会更新…