Node.js 提供了 http 模块直接创建 HTTP 服务,用来响应用户的请求,比如 Node.js 官网提供的创建 HTTP 服务的例子:
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
ThinkJS 也是调用 http.createServer
的方式来创建服务的,所以整个运行流程包含了启动服务和响应用户请求二个部分。
npm start
或者 node development.js
run
方法。think.config
和 think.logger
对象。src/bootstrap/master.js
文件src/
。app/
目录下。workers
来 fork 对应数目的 Worker。Worker 进程启动完成后,触发 appReady
事件。(可以通过 think.app.on("appReady")
来捕获)think.config
和 think.logger
对象。src/config/extend.js
。think.app.modules
上,如果为单模块,那么值为空数组。src/controller/*.js
),放在 think.app.controllers
对象上。src/logic/*.js
),放在 think.app.logics
对象上。src/model/*.js
),放在 think.app.models
对象上。src/service/*.js
),放在 think.app.services
对象上。src/config/router.js
,放在 think.app.routers
对象上。src/config/validator.js
,放在 think.app.validators
对象上。src/config/middleware.js
,并通过 think.app.use
方法注册。src/config/crontab.js
,并注册定时任务服务。src/bootstrap/worker.js
启动文件。onUncaughtException
和 onUnhandledRejection
错误事件,并进行处理。可以在配置 src/config.js
自定义这二个错误的处理函数。think.beforeStartServer
注册的启动前处理函数执行,这里可以注册一些服务启动前的事务处理。createServer
,那么执行这个函数 createServer(port, host, callback)
来创建服务。think.app.listen
来启动服务。appReady
事件,其他地方可以通过 think.app.on("appReady")
监听。think.app.server
对象。服务启动后,会打印下面的日志:
[2017-07-02 13:36:40.646] [INFO] - Server running at http://127.0.0.1:8360
[2017-07-02 13:36:40.649] [INFO] - ThinkJS version: 3.0.0-beta1
[2017-07-02 13:36:40.649] [INFO] - Enviroment: development #当前运行的环境
[2017-07-02 13:36:40.649] [INFO] - Workers: 8 #子进程数量
当用户请求服务时,会经过下面的步骤进行处理。
www/static/
下,如果命中当前请求是个静态资源,那么这个 middleware 处理完后提前结束,不再执行后面的 middleware。request.body
对象上,方便后续读取。ctx.controller
和 ctx.action
上,方便后续处理。如果项目是多模块结构,那么还有 ctx.module
。ctx
传递进去。如果不存在则直接跳过__before
方法,如果返回 false
则不再执行后续所有的逻辑(提前结束处理)xxxAction
方法存在则执行,结果返回 false
则不再执行后续所有的逻辑xxxAction
方法不存在,则试图执行 __call
方法__after
方法,如果返回 false
则不再执行后续所有的逻辑false
来阻断后续逻辑的执行this.body
属性上然后返回给用户。onUncaughtException
或者 onUnhandledRejection
事件,或者 Worker 异常退出时,Master 会捕获到错误,重新 fork 一个新的 Worker 进程,并杀掉当前的进程。可以看到,所有的用户请求处理都是通过 middleware 来完成的。具体的项目中,可以根据需求,组装更多的 middleware 来处理用户的请求。