2021SC@SDUSC
src/controller/home/
这个文件夹名字看起来像是控制器的主页部分。实际上代表了什么含义呢?这就要靠我们的分析去探索了。
src/controller/home/ceshi.js
我们猜测这是测试的相关代码。(那么为什么不写成test而是写成拼音的ceshi呢,要知道这是一个不好的习惯。)
开头就是很长的一段代码,让我们一点点拆解。
const fs = require('fs');
开头的require调用include 几乎完全一样,除了处理失败的方式不同之外。require 在出错时产生 E_COMPILE_ERROR 级别的错误。换句话说将导致脚本中止而 include 只产生警告(E_WARNING),脚本会继续运行。
module.exports = class extends think.Controller {
}
https://www.cnblogs.com/fayin/p/6831071.html介绍了module.exports的用处:CommonJS规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports)是对外的接口。加载某个模块,其实是加载该模块的module.exports属性。require方法用于加载模块。这也可以解释上面为何调用require方法。
https://thinkjs.org/zh-cn/doc/3.0/controller.html解释了think.Controller的作用。MVC 模型中,控制器是用户请求的逻辑处理部分。比如:将用户相关的操作都放在 user.js 里,每一个操作就是里面一个 Action。项目中的 controller 需要继承 think.Controller 类,这样能使用一些内置的方法。当然项目中可以创建一些通用的基类,然后实际的 controller 都继承自这个基类。
之后的定义其中有几个async函数。具体解释见这里https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/async_function,我这里只把介绍搬运过来:async函数是使用async关键字声明的函数。 async函数是AsyncFunction构造函数的实例, 并且其中允许使用await关键字。async和await关键字让我们可以用一种更简洁的方式写出基于Promise的异步行为,而无需刻意地链式调用promise。await 关键字 只能放在 async 函数内部, await关键字的作用 就是获取 Promise中返回的内容, 获取的是Promise函数中resolve或者reject的值
async fetchAction() {
const res = await this.fetch('https://assets-cdn.github.com/images/modules/logos_page/Octocat.png');
// console.log(res);
// const dest = fs.createWriteStream('./octocat.png');
// res.body.pipe(dest);
this.header('Content-Type', 'image/png');
return this.body = res.body;
}
这一段是“获取”的动作,如上文所示使用await关键字获取资源,并在最后返回标题和图片。
async donatesAction() {
return this.body = 'donates';
}
这一段是定义了一个“捐赠”的动作,返回结果是把内容body换成捐赠相关的内容。
async emailAction() {
const transport = {
service: 'qq',
auth: {
user: 'arterli@qq.com', // your account
pass: 'vxheoipkldjgbhgi' // authorization code, not the email password
}
};
const options = {
from: 'arterli@qq.com', // sender address
to: 'cmswing@126.com', // list of receivers
subject: 'this is subject'