ThinkJS 2.0 Documentation
ᳪفள᭛
Օᕨ
ጱ Node.js MVC ຝֵ҅አ ES7 Ӿ async/await ҅ᘏ ES6ݎෛقThinkJS ฎӞֵྃአ ES6/7 ᇙ තԧࢵٖक़ռग़ຝጱᦡᦇቘஷޕӾጱ */yield ᇙବᥴ٬ԧ Node.js Ӿྍ્ॺጱᳯ̶᷌ݶ ṛප̶̵ܔᓌےNode.js ᶱፓๅ ݎమ҅ᦏ
පሲ҅ฎ۠ಅࣁ̶ଚӬෛᇇጱ Node.js ES6 ᇙԞํԧݎᶱፓݢզय़य़ṛݎአ ES6/7 ᇙֵ Զᇙᬮဌํඪ೮҅Ԟݢզۗ Babel ᖫᦲඪ೮̶ํֵܨঅጱඪ೮҅
ᇙ
ᶱፓݎአ ES6/7 ᇙֵ
ᇇӧඪ೮̶੦ٌฎֵڹۗ Babel ᖫᦲ҅ݢզࣁᶱፓӾय़ᙦֵአ ES6/7 ಅํጱᇙ҅෫ᵱஞߺԶᇙ୮ አ async/await ᘏ */yield ᥴ٬ྍࢧ᧣ጱᳯ̶᷌ JavaScript //user controller, home/controller/user.js export default class extends think.controller.base { //login action async loginAction(self){ //ইຎฎget᧗҅ፗളดᐏጭ୯ᶭᶎ if(this.isGet()){ return this.display(); } ᬯ᯾ݢզ᭗ᬦpostොဩ឴ݐಅํጱහഝ҅හഝ૪ᕪࣁlogic᯾؉ԧ໊ḵ// let data = this.post(); let md5 = think.md5('think_' + data.pwd); ᯈහഝପӾԭጱፓ܃ݸጱੂᎱ݄ੂےአಁݷ// let result = await this.model('user').where({name: data.name, pwd: md5}).find(); ձ֜හഝ҅ᤒᐏአಁݷᘏੂᎱᲙکᯈ܃ইຎ๚// if(think.isEmpty(result)){ return this.fail('login fail'); } sessionفٟ௳מݸ҅ਖ਼አಁ௳מአಁک឴ݐ// await this.session('userInfo', result); return this.success(); } }
ӤᶎጱդᎱ౯ժֵአԧ ES6 ᯾ጱ class , export , let զ݊ ES7 ᯾ጱ async await ᒵᇙ҅ Session ᮷ฎྍ֢҅֕ۗ async/await ҅դᎱ᮷ฎݶྍԡٟጱ̶๋ݸֵ فᡱᆐັᧃහഝପٟ አ Babel ᬰᤈᖫᦲ҅੪ݢզᑞਧᬩᤈࣁ Node.js ጱሾहӾԧ̶
ඪ೮ग़ᐿᶱፓᕮग़ᐿᶱፓሾह
̶ݎཛྷࣘཛྷୗᒵग़ᐿᶱፓᕮ҅ݢզჿ᪃ݱᐿᶱፓ॔ଶጱړཛྷࣘཛྷୗ̵ฦ᭗ཛྷୗ̵ܔᶱፓඪ೮
ἕᦊඪ೮ development ҅ testing prodution 3 ᐿᶱፓሾह҅ݢզࣁӧݶጱᶱፓሾहӥᬰᤈӧݶ ጱᯈᗝ҅ჿ᪃ࣁӧݶሾहӥጱᯈᗝᵱ҅ݶᬮݢզचԭᶱፓᵱᥝᬰᤈಘ̶
ඪ೮ӿጱහഝପ
ThinkJS ඪ೮ mysql ҅ mongodb ҅ sqlite ᒵଉᥠጱහഝପ҅ଚӬᤰԧஉग़֢හഝପጱളݗ҅෫ᵱ ᚆ̶ۑᘶཛྷࣳᒵṛᕆى̵ۓᄋ၏̶ݶඪ೮Ԫقᒵਞفಋۖ೪ള SQL ݙ҅ᬮݢզᛔۖᴠྊ SQL ဳ
դᎱᛔۖๅෛ
Ԟӧአۗᒫӣ҅ۓNode.js ๐ ސኞප҅ӧአ᯿ܨදݸᒈץկ҅ګThinkJS ٖᗝԧӞॺդᎱᛔۖๅෛጱ ොཛྷ̶ࣘ
ୌ REST ളݗڠᛔۖ ইຎమࣁ̶ݎݢਠ౮ REST API ጱܨୌ REST ളݗ҅ӧአٟձ֜ጱդᎱڠአ thinkjs եݢզᛔֵۖ REST ളݗӾᬦᄁਁྦྷᘏᬰᤈᴴ໊ḵ҅Ԟஉො॒ቘ̶
ඪ೮ग़ᐿ WebSocket ପ
ThinkJS ඪ೮ socket.io ҅ sockjs ᒵଉᥠጱ WebSocket ପ҅ଚӬᬯԶପᬰᤈ۱ᤰ҅ಾଘݱӻପԏᳵ ᘏӞᛘጱ֛ḵ̶ݎളݗ᧣አӤጱ૧҅ᕳ
ӿጱၥᦶአֺ
ᚆۑᵑຝכද᮷ํଫጱၥᦶአֺץӞེྯ҅ %95 کጱၥᦶአֺ҅դᎱᥟፍሲᬡ +1500 ํތ ThinkJS ጱᑞਧ̶
ۓඪ೮եᤈ᧣አಗᤈਧձ
੪ݢզஉොګThinkJS ᯾ጱ Action ᴻԧݢզߥଫአಁጱ᧗҅ݶඪ೮ࣁեᤈӥᦢᳯ҅ۗᬯॺ ̶ۓጱಗᤈਧձ
Hook Middleware
ݢզᅎၚጱᦢᳯ᧗ᬰᤈೝ౼॒ቘ̶҅ګThinkJS ֵአ Hook Middleware
ᧇᕡጱ෭ப
ᚆ҅ݢզஉොጱັ፡ݱᐿ෭ப҅ො᭄ັᳯ̶᷌ۑThinkJS ٖᗝԧᧇᕡጱ෭ப
HTTP ᧗෭ப
[2015-10-12 14:10:03] [HTTP] GET /favicon.ico 200 5ms [2015-10-12 14:10:11] [HTTP] GET /zh-CN/doc.html 200 11ms [2015-10-12 14:10:11] [HTTP] GET /static/css/reset.css 200 3ms
Socket ᬳള෭ப
[2015-10-12 14:13:54] [SOCKET] Connect mysql with mysql://root:[email protected]:3306
Კ෭ப
[2015-10-12 14:15:32] [Error] Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'root3'@'localhost' (using password: YES)
[2015-10-12 14:16:12] [Error] Error: Address already in use, port:8360. http://www.thinkjs.org/doc/error.html#EADDRINUSE ګӿጱ᪠ኧ
ےଚӬݢզचԭཛྷࣘᦡᗝ̶ݢզᦏ URL ๅ҅ګ᪠ኧ̵ᶉா᪠ኧᒵग़ᐿ᪠ኧڞ᪠ኧ̵ᥢڞThinkJS ඪ೮ྋ ᓌ၄ጱݶ݈ӧӶ०ᚆ̶
ඪ೮ࢵᴬ۸ग़Ԇ᷌
ᚆ̶ۑጱොဩ੪ݢզඪ೮ࢵᴬ۸ग़Ԇ᷌ᒵܔThinkJS ֵአஉᓌ
Өٌ՜ຝጱྲ
Ө express/koa ྲ
ᶱፓӾᵱᥝۗय़ᰁጱᒫӣොൊկ҅ܔᚆྲᓌۑጱ׀ጱຝ҅ຝܔexpress/koa ฎ 2 ӻྲᓌ ಅզᅎၚଶྲṛ̶ֵ֕አஉग़ᒫӣොᕟկӞොᶎṛԧᶱፓጱ॔ଶ҅ݚӞොᶎᒫӣ҅ݎᚆਠ౮ᶱፓጱ ොൊկᨶᰁ݇૧ӧἶ҅Ԟտଃٖਂအᄋᒵᷚᴾ̶ koa 1.x ֵአ ES6 ᯾ጱ */yield ᥴ٬ԧྍࢧ᧣ጱᳯ᷌҅֕ */yield ݝտฎӻᬦჁᥴ٬ොໜ҅տᤩ ES7 ᯾ጱ async/await ಅ๊դ̶
ᚆ᮷ᕪᬦԧӸ໒ጱᚆٖਂအᄋᒵොᶎጱၥᦶ҅ଚӬࣁᶱፓӾݢۑԧෆॺᥴ٬ොໜ҅ྯӻ׀ᘒ ThinkJS զፗളֵአ ES6/7 ಅํጱᇙ̶
Ө sails ྲ
ොᶎԞஉग़ᤰֵ҅አ᩸قෆॺᥴ٬ොໜጱ Node.js ຝ҅හഝପ̵REST API̵ਞ׀sails ԞฎӞӻ ො̶ྲ
ଃஉय़ጱӧ҅ᛘᶱፓӾ෫ݎsails ྍࢧ᧣ጱᳯ᷌ᬮဌํս۸҅ᬮฎֵአ callback ጱොୗ҅ᕳ ֕ ဩঅጱֵአ ES6/7 ᇙ̶
ThinkJS ጱӧ᪃
Ӥᶎ᧔ԧஉग़ ThinkJS ጱսᅩ҅୮ᆐ ThinkJS Ԟํஉग़ጱӧ᪃̶ইғ
ຝᬮྲෛ҅ᗌᐒ܄ᒵොᶎጱඪ೮ ᬮဌํᕪᬦ᩻य़ࣳᶱፓጱ༄ḵ
ES6/7 ݇ᘍ
ԭ ES6/7 ᇙݢզ݇ᘍӥᶎጱғى
JavaScript Promiseᭁ֦ԡ learn-es2015 ᳪف ECMAScript 6 ஞᘏጱ ES2015 ਫڡ ᕳ JavaScript ECMAScript 6 Features ECMAScript 6 compatibility table ECMAScript 7 Features ECMAScript 7 compatibility table
ୌᶱፓڠ
ਞᤰ Node.js
ਞᤰ Node.js ሾह҅ݢզ݄ ਥො ӥضᵱᥝ҅ڹThinkJS ฎӞྃ Node.js ጱ MVC ຝ҅ಅզਞᤰ ThinkJS ԏ ๋ෛጱਞᤰ۱ᬰᤈਞᤰ҅Ԟݢզ᭗ᬦٌ՜ӞԶჀ᭲ਞᤰ̶
̶ۑᤒᐏਞᤰ౮ڞ҅ڊଫጱᇇݩᬌکਞᤰਠ౮ݸ҅ࣁեᤈಗᤈ node -v ҅ইຎᚆ፡
๐ۖސ෫ဩڞވᕆ Node.js҅܋ThinkJS ᵱᥝ Node.js ጱᇇ >=0.12.0 ҅ইຎᇇੜԭᬯӻᇇ҅ᵱᥝ ๅṛᇇ̶ 4.2.1 کᕆ܋ୌᦓਖ਼ Node.js ᇇ̶ۓ
ਞᤰ ThinkJS
ݢਞᤰ ThinkJSғܨ᭗ᬦӥᶎጱե
Bash npm install thinkjs@2 -g --verbose
ইຎਞᤰஉౌጱᦾ҅ݢզᦶֵአ taobao ጱრᬰᤈਞᤰ̶ٍ֛ইӥғ
Bash npm install thinkjs@2 -g --registry=https://registry.npm.taobao.org --verbose
ਞᤰਠ౮ݸ҅ݢզ᭗ᬦ thinkjs --version thinkjs -V եັ፡ਞᤰጱᇇ̶
ᴻധ҅ݢզ᭗ᬦڢጱᇇڹਞᤰᬦ ThinkJS 1.x ጱᇇ҅ݢᚆᵱᥝਖ਼ԏڹဳ ғইຎԏ ᴻ̶ڢnpm uninstall -g thinkjs-cmd ե
ๅෛ ThinkJS
ੴጱ ThinkJSقๅෛ
ੴጱ ThinkJSғقݢๅෛܨಗᤈӥᶎጱե Bash npm install -g thinkjs@2
ๅෛᶱፓ᯾ጱ ThinkJS
ᶱፓጱ ThinkJSғڹݢๅෛ୮ܨࣁᶱፓፓ୯ӥ҅ಗᤈӥᶎጱե
Bash npm install thinkjs@2
ୌᶱፓڠ
:ୌᶱፓڠThinkJS ਞᤰਠ౮ݸ҅੪ݢզ᭗ᬦӥᶎጱե
Bash thinkjs new project_path; #project_pathԅᶱፓਂනጱፓ୯
ୌӞӻ ES6 ཛྷୗጱᶱፓٍ֛҅ইӥғڠᶱፓጱᦾ҅ݢզݎইຎమአ ES6 ᇙ
Bash thinkjs new project_path --es6; #project_pathԅᶱፓਂනጱፓ୯
ԧғۑୌ౮ڠᤒᐏᶱፓ҅ڊইຎᚆ፡ᥠᔄ֒ӥᶎጱᬌ create : demo/ create : demo/package.json create : demo/.thinkjsrc create : demo/nginx.conf create : demo/README.md create : demo/www/ create : demo/www/index.js create : demo/app create : demo/app/common/runtime create : demo/app/common/config create : demo/app/common/config/config.js create : demo/app/common/config/view.js create : demo/app/common/config/db.js ... create : demo/app/home/logic create : demo/app/home/logic/index.js create : demo/app/home/view create : demo/app/home/view/index_index.html
enter path: $ cd demo/
install dependencies: $ npm install
run the app: $ npm start
ᚆ -> ThinkJS ե̶ۑ᧗ᥠ ಘ҅௳מୌᶱፓեጱๅग़ڠԭى
ਞᤰׁᩢ
ᶱፓፓ୯҅ಗᤈ npm install ਞᤰׁᩢ҅ݢզֵአ taobao რᬰᤈਞᤰ̶فᶱፓਞᤰݸ҅ᬰ
Bash npm install --registry=https://registry.npm.taobao.org --verbose
ᖫᦲᶱፓ
ࣁᶱፓӥಗᤈեضӤԧ --es6 ݇හ҅դᎱᵱᥝᖫᦲݸᚆᬩᤈ̶ᮎԍᵱᥝےୌᶱፓڠইຎ දݸ੪տᛔۖᖫᦲԧ̶ץnpm run watch-compile ҅ᬯկํ
ಗᤈեݸտ೯᩸Ӟӻᬰᑕ҅ဳӧᥝᕮᬯӻᬰᑕٌ҅՜եݢզٚෛӞӻຽᓋᶭ᯾ಗᤈ̶
ݢ̶ইຎฎᘌᶱፓݢܨۓ๐ۖސᚆ҅෫ᵱٚಗᤈᧆե҅ፗളۑဳ ғ 2.0.6 ᇇতٖᗝԧᛔۖᖫᦲጱ ݢҁනܨ ;()դᎱ instance.compileفے ෛᇇ҅ᆐݸࣁկ www/index.js๋کᕆ܋ զਖ਼ ThinkJS ҂̶ڹࣁ instance.run() ԏ
ᶱፓۖސ
̶ۑ౮ۖސۓᔄ֒ӥᶎጱٖ҅ᤒᐏ๐کࣁᶱፓፓ୯ӥಗᤈե npm start ҅ইຎᚆ፡
[2015-09-21 20:21:09] [THINK] Server running at http://127.0.0.1:8360/ [2015-09-21 20:21:09] [THINK] ThinkJS Version: 2.0.0 [2015-09-21 20:21:09] [THINK] Cluster Status: closed [2015-09-21 20:21:09] [THINK] WebSocket Status: closed [2015-09-21 20:21:09] [THINK] File Auto Reload: true [2015-09-21 20:21:09] [THINK] App Enviroment: development
ᦢᳯᶱፓ
ݢ̶ܨ /ၨᥦ҅ᦢᳯ http://127.0.0.1:8360
ᦤ 8360 ᒒݗݢᦢᳯ̶כইຎฎࣁᬱᑕ҅ᵱᥝ᭗ᬦᬱᑕጱ IP ᦢᳯ҅ݶᥝ
ᶱፓᕮ
ୌਠᶱፓݸ҅ᶱፓፓ୯ᕮᔄ֒ইӥғڠ᭗ᬦ thinkjs ե
|-- nginx.conf |-- package.json |-- src | |-- common | | |-- bootstrap | | | |-- generate_icon.js | | | `-- middleware.js | | |-- config | | | |-- config.js | | | |-- env | | | | |-- development.js | | | | `-- production.js | | | |-- hook.js | | | |-- locale | | | | |-- en.js | | | | `-- zh-CN.js | | | `-- route.js | | |-- controller | | | `-- error.js | | `-- runtime | `-- home | |-- config | |-- controller | | |-- base.js | | `-- index.js | |-- logic | | `-- doc.js | `-- model |-- view | `-- zh-CN | |-- common | | |-- error_400.html | | |-- error_403.html | | |-- error_404.html | | |-- error_500.html | | `-- error_503.html | `-- home | |-- doc_index.html | |-- doc_search.html | |-- inc | | |-- footer.html | | `-- header.html | |-- index_changelog.html | |-- index_demo.html | `-- index_index.html `-- www |-- favicon.ico |-- index.js |-- production.js `-- static |-- css |-- img `-- js
֛ฎᔄ֒ጱ̶֕҅ڦୌጱᶱፓፓ୯ݢᚆํᕡஙጱ૧ڠဳ ғਧӧݶጱཛྷୗ nginx.conf
ݻդቘ̶ݍnginx ጱᯈᗝկ҅ୌᦓᕚӤֵአ nginx ؉ src
کտᛔۖਖ਼ src ፓ୯ӥጱկᖫᦲۖސୌᶱፓํᧆፓ୯̶ᶱፓڠრդᎱፓ୯ֵ҅አ --es6 ݇හ app ፓ୯ӥ̶
ፗളํ app/ ፓ୯̶ڞୌᶱፓ҅ڠইຎဌํֵአ ES6 ᇙ src/common
ጱ҅ common ཛྷࣘӥਂනӞԶ᭗አጱ॒ቘ᭦ᬋ̶ړښ᭗አཛྷࣘፓ୯҅ᶱፓፓ୯᮷ฎೲཛྷࣘ src/common/bootstrap
̶ ҅෫ᵱಋۖ requireےፓ୯҅ᧆፓ୯ӥጱկտᛔۖۖސᶱፓ
ᚆ̶ۑහ̵ဳٙӾᳵկᒵଉአጱڍੴقݢզࣁᬯӻፓ୯ӥկ᯾ਧԎӞԶ
හڍੴقਧԎ
JavaScript // src/common/bootstrap/fn.js global.formatDate = obj => { ... }
හ̶ڍහ formatDate ҅ᮎԍᶱፓ᯾ձ֜ࣈො᮷ݢզፗളֵአᧆڍੴقᬯ᯾ਧԎԧӞӻ
ဳٙӾᳵկ
JavaScript // src/common/bootstrap/middleware.js think.middleware('replace_image', http => { ... });
ᬯ᯾ਧԎԧӞӻӾᳵկ replace_image ҅ᮎԍ੪ݢզࣁᯈᗝկ hook.js ᯾ਖ਼ᧆӾᳵկဳٙᬰ݄ԧ̶
ဳ ғbootstrap ݝᚆනࣁ common ཛྷࣘ᯾̶ src/common/config
ᯈᗝկ҅ᬯ᯾නӞԶ᭗አጱᯈᗝ̶
Ӿғ᪠ኧᯈᗝ̵hook ᯈᗝ̵ࣈ۸ᯈᗝᒵᶳනࣁᬯ᯾̶ٌ
JavaScript 'use strict'; /** * config */ export default { //key: value }; src/common/controller
ද̶ץ̶ٌӾ error.js ᯾Კ॒ቘጱӧݶᤈԅ҅ᶱፓ᯾ݢզ໑ഝᵱᥝᬰᤈګ҅නӞԶ᭗አጱഴګഴ src/common/runtime
ᶱፓᬩᤈኞ౮ጱӞԶፓ୯҅ইғᖨਂկፓ୯҅አಁӤփጱկԁਂනጱፓ୯̶ src/home
දᯈᗝ default_moduleץhome ཛྷࣘ҅ᶱፓἕᦊཛྷ̶ࣘݢզࣁ src/common/config/config.js Ӿ ᯿ෛਧԎἕᦊཛྷ̶ࣘ src/home/logic
አڹྋଉ̵୮ވݳဩ̵Իጱහഝฎވғ݇හฎތᬰᤈ᭦ᬋ໊ḵ҅ݢզ۱ضݢզڹ᭦ᬋ॒ቘ̶ྯӻ֢ಗᤈ ᴴᒵ̶ᬯݢզᴳ֗ controller ᯾ጱ action ጱ॔ଶ̶ํވአಁฎڹ૪ᕪጭ୯̵୮ވಁฎ
JavaScript 'use strict'; /** * logic * @param {} [] * @return {} [] */ export default class extends think.logic.base { /** * index action logic * @return {} [] */ indexAction(){
} } src/home/controller
̶ ̶Ӟӻ url ଫӞӻ controller ӥጱ actionګഴ JavaScript 'use strict';
import Base from './base.js';
export default class extends Base { /** * index action * @return {Promise} [] */ indexAction(){ //auto render template file index_index.html return this.display(); } } src/home/model
̶֢ىཛྷ̶ࣳහഝପፘ view
ᥤࢶፓ୯҅ਂනଫጱཛྷᇇկ̶ইຎඪ೮ࢵᴬ۸ग़Ԇ᷌҅ᮎԍᥤࢶፓ୯ӥᵱᥝํଫጱৼፓ୯̶ www
ྌፓ୯ӥ̶کᶱፓጱݢᦢᳯ໑ፓ୯҅nginx ᯾ጱ໑ፓ୯տᯈᗝ www/development.js
ݗկ̶فද̶ www/production.js ԅᕚӤጱץݗկ҅ݢզ໑ഝᶱፓᵱᥝᬰᤈفཛྷୗӥᶱፓጱݎ
ද̶ץݗկጱդᎱᔄ֒ইӥ҅ݢզ໑ഝᶱፓᵱᥝᬰᤈف JavaScript var thinkjs = require('thinkjs'); var path = require('path');
var rootPath = path.dirname(__dirname);
var instance = new thinkjs({ APP_PATH: rootPath + '/app', ROOT_PATH: rootPath, RESOURCE_PATH: __dirname, env: 'development' });
instance.compile({retainLines: true, log: true});
instance.run(); www/static
ਂනӞԶᶉாᩒრկ̶
դᎱᥢ
կ᪠ஆᶳੜٟ
ᶱፓ҅֕Ӟᛱ᮷᮱ᗟ Linux ᔮᕹӥ̶ݎฎࣁ Windows ᘏ Mac OSX ᔮᕹӥײஉग़
य़ੜٟጱ̶ᬯஉฃړ܄य़ੜٟጱ҅ᘒ Linux ӥฎړ܄ࣁ Windows Mac ᔮᕹӥ҅կ᪠ஆฎӧ ಸᲙԧ̶ܩሾहӥฎঅጱ҅֕Ӥᕚݸݎሿկय़ੜٟጱᳯ᷌ᛘڊ
҅ThinkJS տ༄ၥᶱፓӥկۖސۓኞ҅կ᪠ஆੱᰁ᮷ֵአੜٟਁᒧ̶ଚӬࣁ๐ݎጱ٭ᬯᐿఘعԅԧ ᦄ҅ইғޞտڞ᪠ஆ҅ইຎํय़ٟਁྮ
[2015-10-13 10:36:59] [WARNING] filepath `admin/controller/apiBase.js` has uppercases.
ᖽᬰֵአ 2 ӻᑮ໒
դᎱےෙ҅ᘏํӞԶྍ֢҅ᬯԶ᮷տीڣ᭦ᬋྲ॔҅ํݱᐿկײํ҅ݎࣁ Node.js ሾहӥ ጱᖽᬰ̶
ୌᦓֵአ 2 ӻᑮ໒֢ԅᖽᬰ̶਼҅ڜአԧॡग़ጱܛԅԧӧᛗԭᦏᖽᬰ
ݎአ ES6 ဩֵ ᓌ၄ṛප̶ےES6 Ӿํय़ᰁጱဩᔥݢզᓌ۸౯ժጱդᎱ҅ᦏդᎱๅ Զဩӧඪ೮҅Ԟݢզ᭗ᬦ Babel ᖫᦲඪ೮̶ ಅํֵܨNode.js ๋ෛᇇ૪ᕪঅጱඪ೮ԧ ES6 ጱဩ҅ ᶱፓԧ̶ݎአ ES6 ဩֵײզฎ
ӧᥝֵአ constrcutor ොဩ
ᛔۖ᧣አ̶ইғײᔄਫֺ۸ጱکݢզֵአ constrcutor ොဩᬡ҅ײୌᔄጱڠአ ES6 ᯾ጱ class ֵ
JavaScript export default class think.base { constructor(){ ... } }
ইຎӧֵአ ES6 ᯾ጱ class҅੪ဌํ constrcutor ොဩԧ̶֕
ԧ init ොဩդ๊ constrcutor ොဩ҅ᧆොဩӧᓕฎࣁ class ӥᬮฎۖ׀ԅԧᕹӞ॒ቘ҅ThinkJS ᛔۖᤩ᧣አ̶ײᔄਫֺ۸ጱکӥ᮷ݢզ؉٭ୌᔄጱఘڠா
JavaScript export default class think.base { /** ত۸ොဩ҅ᔄਫֺ۸ᛔۖᤩ᧣አڡ * * @return {} [] */ init(){ ... } }
ဳ ғThinkJS ᯾ಅํጱᔄ᮷տᖀಥ think.base चᔄ̶
አ Babel ᖫᦲֵ
ᡱᆐሿࣁጱ Node.js ᇇ૪ᕪඪ೮ԧஉग़ ES6 ጱᇙ҅֕ᬯԶᇙሿࣁᬮݝฎਫሿԧ҅V8 ᯾ᬮဌํᬯԶ ᚆ̶ۑᇙᬰᤈս۸̶ইғ */yield ᒵ
Ԓಅํጱᇙ҅ݚӞොᶎᖫᦲݸጱᚆԞྲἕپ ಅզୌᦓֵአ Babel ᖫᦲ҅Ӟොᶎݢզֵአ ES6 ES7 ᦊඪ೮ጱᥝṛ̶
አ async/await ๊դ */yieldֵ
ԧڊӞᐿᥴ٬ྍಗᤈጱොဩ҅ਙݝฎӞӻᬦჁጱොໜ҅ES7 ᯾ڊyield ฎ ES6 ᯾/* async/await դ๊ਙ̶ ፘ async/await ҅ */yield ํզӥጱᗌᵅғ yield ᧣አݸᬬࢧӞӻᬽդ҅ᵱᥝۗᒫӣොཛྷࣘಗᤈ̶ইғ co/* 1̵ yield ෫ဩ Arrow Function Ӟֵ᩸አ̶/* 2̵ yield ᧣አݚӞӻ */yield ҅ᵱᥝֵአ yield * ҅ଃӧ̶/* 3̵
V8 */yield ᬮဌํ؉ս۸๋҅অԞ᭗ᬦ Babel ᖫᦲ̶ ڹ4̵ፓ
ݢզֵአ ES7 ᯾ጱ async/await դ๊ */yield ҅ᆐݸֵአ Babel ᖫᦲᬩᤈ̶قಅզਠ
܋ᕆܖ
ᇇጱ̶ 2.0 کᕆ܋ ᬰᤈԧ᯿ٟ҅ฎӻᷓᥟୗጱᇇ҅ಅզ෫ဩፗള 1.xقࣁຝᇙӤ᮷ਠ 2.0
Ө 1.x ᇇ૧
ᶱፓᕮ
ইຎమ 2.0 ӥֵአᔄ֒ 1.x ጱᶱፓ̶ڦጱ҅Ө 1.x ࣁፓ୯ᕮํӞԶ૧ړښἕᦊֵአೲཛྷࣘᬰᤈᶱፓᕮ 2.0 ਧ --mode=normal ̶ইғײୌᶱፓጱڠᕮ҅ݢզࣁ
Bash thinkjs new demo --mode=normal
կय़ੜٟ
ጱ܄x ᯾կݷֵአḧશጱොୗ҅ইғ Controller/indexController.js ̶2.0 ᯾Ӹ໒᭽ Node.js ᐒ.1 ̶ ᥢ҅կ᪠ஆֵአੜٟጱොୗ҅ଚӬկݷ݄ᴻԧᔄࣳ҅ইғ controller/index.js
य़ੜٟጱᳯ̶᷌ړ܄ሿํጱᔮᕹӥڊᓌ၄҅Ӭӧտےදݒݸկݷๅ debug ཛྷୗ
ԧ debug ཛྷୗ҅ސሿᕚӤڊᳮ debug ཛྷୗ҅֕ᕪଉտىdebug ཛྷୗ҅ᕚӤᵱᥝ ސሾहᵱᥝݎx ӥ.1 ሿٖਂအᄋᒵᳯ̶᷌ڊᛘ
ࣁڦړԧ development ҅ testing production 3 ᐿཛྷୗ҅׀ଳԧ debug ཛྷୗ҅ᘒฎ 2.0 ᶱۖސୌଫጱ 3 ӻկ҅ᬯࣁӧݶጱሾहӥ੪ݢզֵአӧݶጱկڠୌᶱፓտڠଫጱሾहӥֵአ҅ ፓԧ̶
හڍ C
හ҅ӧݶࣈොֵአӧݶጱොୗݐᯈᗝ̶ڍහݐᯈᗝ҅2.0 ᯾ଳᴻԧᧆڍ ԧ C׀x ᯾.1 http ጱࣈොֵአ config ොဩݐᯈᗝٌ҅՜ᒵࣈොᵱᥝֵአ ํތController҅Middleware ᒵ think.config ොဩݐᯈᗝ̶
හڍ D M
හ҅ӧݶጱࣈොֵአӧݶጱොୗਫֺ۸ڍහਫֺ۸ཛྷࣳ҅2.0 ᯾ଳᴻԧᬯ 2 ӻڍ ԧ D M׀x ᯾.1 ཛྷ̶ࣳ
Controller҅Model҅Middleware ᒵࣈොֵአ model ොဩਫֺ۸ཛྷٌࣳ҅՜ᒵࣈොֵአ think.model ොဩਫֺ۸ཛྷ̶ࣳ
හڍ Controller҅Model
ԧग़׀හ̶ଚڍୌཛྷࣳᔄ҅2.0 ᯾ଳᴻԧᬯԶڠᔄ҅ Model ګୌഴڠԧ Controller ׀x ᯾.1 ୌᔄ̶ڠᐿොୗ
ୌӞӻཛྷࣳᔄ҅ᶋ ES6 ӥݢզ᭗ᬦڠES6 ፗളֵአ class extends think.model.base ᔄᔄ̶֒ګୌഴڠୌӞӻཛྷࣳᔄ҅ڠthink.model
හڍੴق՜ٌ
ԧ think کහ᮷ᑏڍහ҅ইғ md5 ҅ mkdir ᒵ҅2.0 Ӿਖ਼ᬯԶڍੴقԧӞԶ᭗አጱ׀x ᯾ፗള.1 Ӥ҅ইғ think.md5 ҅ think.mkdir ̶
ᛔಗᤈፓ୯ common/
አ҅2.0 Ӿਖ਼ᧆፓ୯ݷԅ bootstrap ҅ଚӬᥝࣁ common ཛྷࣘ᧣ᤩۖސx ӥ common/ ӥጱկտ.1 ӥ҅ইғ src/common/bootstrap ̶
Behavior Driver
2.0 ਖ਼ Behavior දԅԧ middleware҅Driver දԅԧ adapter̶
ᕚӤ᮱ᗟ
᯾ଳԧᧆկ҅ୌᦓֵአ pm2 2.0҅ۓNode.js ๐ ڹጱᚕ ctrl.sh ᓕቘ୮ܔԧᓌ׀x ᇇӥ.1 ̶ۓ๐ۖސݢܨ ԧ pm2 ጱᯈᗝկ pm2.json ҅ᕚӤ᭗ᬦ pm2 start pm2.json׀ᓕቘ҅ଚӬ
ଉᥠᳯ᷌
ԅՋԍവគ ES6/7 ဩݎᶱፓ
ইғES6 ᯾ጱ */yield̶܋පሲӤጱڥݎԧय़ᰁጱෛᇙ҅ᬯԶᇙտଃय़ጱ׀ES6/7 ᯾ this ֢አऒጱᳯ᷌Ҕ class හᥴ٬ڍ ES7 ᯾ጱ async/await ᇙᥴ٬ྍࢧ᧣ጱᳯ᷌Ҕᓞ१ ဩᔥᥴ٬ᔄᖀಥጱᳯ̶᷌
ඪ೮ᬯԶෛጱᇙ҅֕ۗ Babel ᖫᦲ҅ݢզᑞਧᬩᤈࣁሿࣁጱ Node.jsقᡱᆐሿࣁ Node.js ሾहᬮဌํਠ ̶ڥሾहӾ̶ಅզ౯ժੱݢզՁݑᬯԶෛᇙଃጱ
ԍҘۓ๐ސදկᵱᥝ᯿ץ҅ݎ
ᚆኞප̶ސදᶳ᯿ץկ҅ګӥ҅ኧԭ Node.js ጱ٭ἕᦊఘ
ኞܨදݸݢզᒈץկ҅ګԧӞᐿկᛔۖๅෛጱ׀ଃԧஉय़ጱӧݒ҅ThinkJS ݎᬯᐿොୗӥᕳ ̶ۓ๐ސප҅෫ᵱ᯿
ᕚӤդᎱๅෛᬮฎୌ̶ސտၾᘙӞਧጱᚆ҅ಅզἕᦊݝࣁ development ᶱፓሾहӥګᛔۖๅෛጱ ᦓֵአ pm2 ཛྷࣘᓕቘ̶
දᥤࢶկፓ୯ᕮץெԍ
֢ԏᳵګӥ҅ᥤࢶկ᪠ஆԅ view/[module]/[controller]_[action].html ̶ٌӾഴ٭ἕᦊఘ දᯈᗝկ src/common/config/view.js ғץදԅ / ҅ݢզץฎአ _ ᬳളጱ҅ইຎమਖ਼ᬳളᒧ
JavaScript export default { / දԅץ֢ԏᳵጱᬳളᒧګ//ਖ਼ഴ '/', file_depr: }
ग़ᬰᑕސই֜
̶ێቘᚆ॒ݎᚆ҅ṛଚ܋አग़໐ CPU ڥکᚆᬡۑ cluster ސᕚӤݢզ
ইӥጱᯈᗝғفےݢզࣁᯈᗝկ src/common/config/env/production.js Ӿ
JavaScript export default { cluster_on: true //ސ cluster }
ද᧗᩻ᳵץ
දᯈᗝկ src/common/config/config.js ᯾ timeout ᯈץἕᦊ᧗ጱ᩻ᳵฎ 120s҅ݢզ᭗ᬦ ̶ᗝ JavaScript export default { 30s දԅץ//ਖ਼᩻ᳵ 30, timeout: }
ই֜ഔ឴ଉ
ݢզ᭗ᬦ try/catch ഔ឴ଉ҅ڞJS ฎ෫ဩ᭗ᬦ try/catch ഔ឴ྍଉጱֵ҅֕አ async/await ݸ ইғ
JavaScript export default class extends think.controller.base { async indexAction(){ try{ await this.getFromAPI1(); await this.getFromAPI2(); await this.getFromAPI3(); }catch(err){ ௳מጱᲙٍ֛ک೭ err.message ᭗ᬦ// return this.fail(err.message); } } }
ጱ̶ݎӤᶎጱොୗᡱᆐݢզ᭗ᬦ try/catch ഔ឴ଉ҅֕ࣁ catch ᯾ଚӧᎣ᭲ଉฎߺӻ
ᕳአಁ҅ᬯአෆ֛ጱ try/catch ੪ӧॡොԧ̶௳מਫᴬᶱፓӾ҅ᕪଉᥝ໑ഝӧݶጱᲙᬬࢧӧݶጱᲙ
ෙ҅ইғڣӻྍളݗᬬࢧᇙਧܔྌݢզ᭗ᬦ
JavaScript export default class extends think.controller.base { async indexAction(){ ኼᧆളݗጱᲙҁᧆളݗጱᲙӧ᯿ᥝ҅ݢզኼ҂// await this.getFromAPI1().catch(() => {}); ෙڣ false ଉᬬࢧᇙਧ// let result = await this.getFromAPI2().catch(() => false); if(result === false){ return this.fail('API2 ERROR'); } } }
ኞԧᲙ҅ᬯ੪ݢզᰒӧݶݎෙ੪ݢզොጱᎣ᭲ฎߺӻྍളݗڣইӤᶎդᎱಅᬿ҅᭗ᬦᬬࢧᇙਧ ̶௳מጱᲙᬬࢧӧݶጱᲙ ই֜ኼଉ
ଉ̶ইຎᬯӻଉӧ᯿ᥝڊአ async/await ҅ইຎ Promise ᬬࢧԧӞӻ rejected Promise҅ᮎԍտಲֵ ᵱᥝኼጱᦾ҅ݢզ᭗ᬦ catch ොဩᬬࢧӞӻ resolve Promise ਠ౮̶ইғ
JavaScript export default class extends think.controller.base { async indexAction(){ //᭗ᬦࣁ catch ᯾ᬬࢧ undefined ኼଉ await this.getAPI().catch(() => {}); } }
PREVENTNEXTPROCESS
ሿํӻ message ԅ PREVENT_NEXT_PROCESS ጱᲙ̶ᬯӻᲙݎࣁ᧣አํԶොဩݸҁইғsuccess҂ݸտ ฎᧆᲙ҅ݢզ᭗ᬦވෙฎڣጱ҅ইຎᥝࣁ catch ᯾ےฎ ThinkJS ԅԧᴥྊݸᖅಗᤈႲ ෙ̶ইғڣthink.isPrevent ොဩ
JavaScript module.exports = think.controller({ indexAction(self){ return self.getData().then(function(data){ return self.success(data); }).catch(function(err){ //ኼ PREVENT_NEXT_PROCESS Კ if(think.isPrevent(err)){ return; } console.log(err.stack); }) } }) return ҅ᬯ catch ᯾੪ӧտํྌᔄጱᲙ ےᶎӧᥝႲڹݚӞᐿ॒ቘොୗғԭ success ԏᔄጱොဩ ԧ̶
ଚᤈ॒ቘ
አ async/await ॒ቘྍ҅ฎԀᤈಗᤈጱ̶֕உग़࣋วӥ౯ժᵱᥝଚᤈ॒ቘ҅ᬯݢզय़य़ṛֵ ಗᤈපሲ҅ྌݢզᕮݳ Promise.all ॒ቘ̶ JavaScript export default class extends think.controller.base { async indexAction(){ let p1 = this.getServiceData1(); let p2 = this.getAPIData2(); let [p1Data, p2Data] = await Promise.all([p1, p2]); } }
ӤᶎጱդᎱ p1 p2 ฎଚᤈ॒ቘጱ҅ᆐݸአ Promise.all ឴ݐ 2 ӻහഝ̶ᬯӞොᶎդᎱฎݶྍ ԡٟጱ҅ݶ݈ӧ०ଚᤈ॒ቘጱᚆ̶
ᬰᴤଫአ
ཛྷࣘ
ԧ common ےጱ҅ଚӬᛔۖႲړښୌጱᶱፓฎೲཛྷࣘڠୌᶱፓඪ೮ग़ᐿᶱፓཛྷୗ҅ἕᦊڠ ThinkJS ̵ᥤࢶ̵ཛྷࣳᒵկ̶ګhome 2 ӻཛྷ̶ࣘྯӻཛྷࣘํᇿᒈጱᯈᗝ̵ഴ
ݸݣ 2 ӻཛྷ̶ࣘڹԅړਮᔮᕹݢܗႴศ̶ইғӞᛱӞӻےᶱፓ҅ݢզᦏᶱፓᕮๅړښአཛྷࣘጱොୗֵ
ᤒڜཛྷࣘ
ᤒғڜཛྷࣘکᬰ݄ src/ ፓ୯੪ݢզ፡
drwxr-xr-x 5 welefen staff 170 Aug 18 15:55 common/ drwxr-xr-x 6 welefen staff 204 Sep 8 19:14 home/ common ཛྷࣘ
կ҅ۖސᚆ҅ইғ ᭗አጱᯈᗝ҅runtime ፓ୯҅ۑcommon ཛྷࣘฎӻ᭗አཛྷࣘ҅ᧆཛྷࣘӥਂනӞԶ᭗አጱ ᒵ̶ګᲙ॒ቘഴ
ӧᚆߥଫአಁጱ᧗̶ګဳ ғᧆཛྷࣘӥጱഴ
ἕᦊཛྷࣘ home ӥ̶ کཛྷࣘտᛔۖଫکἕᦊཛྷࣘԅ home ཛྷ̶ࣘ୮ᥴຉአಁጱ᧗ತӧ
දᯈᗝկ src/common/config/config.js ғץදἕᦊཛྷࣘ҅ץݢզ᭗ᬦᯈᗝ default_module JavaScript blog ਖ਼ἕᦊཛྷࣘݷදԅ// export default { default_module: 'blog' }
ཛྷࣘےႲ
ݢਠ౮̶ܨཛྷࣘፗള᭗ᬦ thinkjs եےႲ
ୌݷԅ xxx ጱཛྷ̶ࣘڠݢܨ҅ ᶱፓፓ୯ӥ҅ಗᤈ thinkjs module xxxڹࣁ୮
ୌ̶ڠ෫ဩڞইຎཛྷࣘݷ૪ᕪਂࣁ҅
ᐬአཛྷࣘ
ᶱፓӥጱཛྷࣘ҅ଚᦊԅಅํጱཛྷࣘ᮷ฎݢአጱ̶ڦThinkJS ἕᦊտᛔۖັತᦩ
ӥᶎጱᯈᗝғےදᯈᗝկ src/common/config/config.js ҅Ⴒץཛྷࣘ҅ݢզړইຎమᐬአ᮱
JavaScript export default { deny_module_list: ['xxx'] //ᐬአ xxx ཛྷࣘ }
ګഴ
ฎӞᔄ֢ጱᵞݳ҅አߥଫአಁݶӞᔄጱ᧗̶ګഴ
ګਧԎഴ
҅կٖګୌկ src/home/controller/article.js ҅ᤒᐏ home ཛྷࣘӥํݷԅ article ഴڠ ᔄ֒ইӥғ JavaScript 'use strict';
import Base from './base.js';
export default class extends Base { /** * index action * @return {Promise} [] */ indexAction(){ //auto render template file index_index.html return this.display(); } }
ইຎӧమֵአ ES6 ဩ҅ᮎԍկٖᔄ֒ইӥғ
JavaScript 'use strict';
var Base = require('./base.js');
module.exports = think.controller(Base, { /** * index action * @return {Promise} [] */ indexAction: function(self){ //auto render template file index_index.html return self.display(); } });
ဳғӤᶎጱ Base ᤒᐏਧԎӞӻचᔄٌ҅՜ጱᔄ᮷ᖀಥᧆचᔄ҅ᬯ੪ݢզࣁचᔄ᯾؉ӞԶ᭗አጱ॒ቘ̶
አ Generator Functionֵ
᯾ݢզஉොጱֵአ Generator Function ॒ቘྍ્ॺጱᳯ̶᷌ګഴ
ES6 ොୗ JavaScript 'use strict';
import Base from './base.js';
export default class extends Base { /** * index action * @return {Promise} [] */ * indexAction(){ let model = this.model('user'); let data = yield model.select(); return this.success(data); } }
ୌᔄጱොୗڠாۖ
JavaScript 'use strict';
var Base = require('./base.js');
module.exports = think.controller(Base, { /** * index action * @return {Promise} [] */ indexAction: function *(){ var model = this.model('user'); var data = yield model.select(); return this.success(data); } });
አ async/awaitֵ
̶ ᯾ֵአ ES7 ᯾ጱ async/awaitګۗ Babel ᖫᦲ҅ᬮݢզࣁഴ
ES7 ොୗ JavaScript 'use strict';
import Base from './base.js';
export default class extends Base { /** * index action * @return {Promise} [] */ async indexAction(){ let model = this.model('user'); let data = await model.select(); return this.success(data); } }
ୌᔄጱොୗڠாۖ
JavaScript 'use strict';
var Base = require('./base.js');
module.exports = think.controller(Base, { /** * index action * @return {Promise} [] */ indexAction: async function(){ var model = this.model('user'); var data = await model.select(); return this.success(data); } }); init ොဩ
ত۸ಗᤈጱොဩ҅ਖ਼ᧆොڡୌጱᔄ੪ဌํᧆොဩԧ҅ԅԧᕹӞڠES6 ᯾ጱ class ํ contructor ොဩ҅֕ۖா ဩᕹӞਧԎԅ init ̶
ᛔۖ᧣አ҅෫ᵱಋૡ᧣አ̶ײᧆොဩࣁᔄਫֺ۸ጱ
ES6 ොୗ
̴ “`js ‘use strict’; import Base from ‘./base.js’; export default class extends Base { init(http){ super.init(http); //᧣አᆿᔄጱinitොဩ
… } } ”`
ୌᔄොୗڠாۖ
JavaScript 'use strict';
var Base = require('./base.js');
module.exports = think.controller(Base, { init: function(http){ this.super('init', http); //᧣አᆿᔄጱinitොဩ ... } });
init ොဩ᯾ᵱᥝ᧣አᆿᔄጱ init ොဩ҅ଚਖ਼݇හ http փ᭓ᬰ̶݄
ᗝ֢ __beforeڹ
ᗝڹᛔۖ᧣አ̶ইຎڹᗝ֢҅ොဩݷԅ __before ҅ᧆොဩտࣁٍ֛ጱ Action ᧣አԏڹThinkJS ඪ೮ ᕮ᧗̶ڹӧտ᧣አٍ֛ጱ Action҅ᬯݢզڞ֢᯾ᴥྊԧݸᖅդᎱᖀᖅಗᤈ҅
ES6 ොୗ
̴ “`js ‘use strict’; import Base from ‘./base.js’; export default class extends Base { /** ᗝොဩڹ * * @return {Promise} [] */ __before(){ … } } ”`
Action
Ӟӻ Action դᤒӞӻᥝಗᤈጱ̶֢ইғ url ԅ /home/article/detail ҅ᥴຉݸጱཛྷࣘԅ /home ҅ഴ ԅ article ҅ Action ԅ detail ҅ᮎԍಗᤈጱ Action ੪ฎկګ src/home/controller/aritcle ᯾ጱ detailAction ොဩ̶
JavaScript 'use strict';
import Base from './base.js';
export default class extends Base { /** ௳מ឴ݐᧇᕡ * * @return {Promise} [] */ detailAction(self){ ... } }
տᛔۖ؉۸ٍ֛҅ጱ۸ᒽኼᥠ ᪠ኧ -> य़ੜٟ۸̶҅ _ ํތ᯾ ইຎᥴຉݸጱ Action
ݸᗝ֢ __after
ThinkJS ඪ೮ݸᗝ֢҅ොဩݷԅ __after ҅ᧆොဩտࣁٍ֛ጱ Action ᧣አԏݸಗᤈ̶ইຎٍ֛ጱ Action ݸᗝ֢ӧտ᧣አ̶ڞ᯾ᴥྊԧݸᖅጱդᎱᖀᖅಗᤈ҅
ᑮ֢ __call
ӥጱṹොဩ __call ̶ᬯ᯾ݢګਂࣁ҅֕ Action ӧਂࣁ҅տᦶࢶ᧣አഴګ୮ᥴຉݸጱ url ଫጱഴ զӧਂࣁጱොဩᬰᤈᕹӞ॒ቘ̶ JavaScript 'use strict';
import Base from './base.js';
export default class extends Base { /** * @return {Promise} [] */ __call(){ ... } }
Კ॒ቘ
տ᧣አᲙ॒ቘ̶ ThinkJS ٖᗝԧӞॺᧇᕡጱײአಁဌᴴᒵӞԶଉ᧗҅ᬯڹ୮ url ӧਂࣁᘏ୮ ᚆ -> Კ॒ቘ̶ۑ᧗ᥠ ಘٍ֛҅ګᲙ॒ቘ
හഝ໊ḵ
᯾ጱ᭦ᬋ॔ଶ҅ګᵱᥝහഝݳဩᬰᤈ໊ḵ̶ԅԧᴳ֗ഴ҅ڹ᯾ࣁֵአአಁԻጱහഝԏګഴ ̶֢ىԧӞ੶ Logic ӫᳪአ॒ቘහഝ໊ḵᴴ໊ḵᒵፘ׀ThinkJS
ᚆ -> හഝ໊ḵ̶ۑ᧗ᥠ ಘ௳מᧇᕡ
ཛྷᇇວݒᰁᩙ
᧗ᥠ ᬯ᯾̶௳מཛྷᇇວٍ֛҅᯾ݢզ᭗ᬦ assign display ොဩᬰᤈݒᰁᩙګഴ
ཛྷࣳਫֺ۸
Ӿݢզ᭗ᬦ this.model ොဩள᭛឴Ӟӻཛྷࣳጱਫ̶ֺګࣁഴ
JavaScript export default class extends think.controller.base { indexAction(){ user //ਫֺ۸ཛྷࣳ this.model('user'); = model let ... } } model ොဩๅग़ֵአොୗ᧗ᥠ API -> think.http.base̶ http ࣁਫֺ۸҅տਖ਼ http փ᭓ᬰ̶݄ᧆ http ฎ ThinkJS req res ᯿ෛ۱ᤰጱӞӻګഴ ҅ᘒᶋ Node.js ٖᗝጱ http ̶
Action ᯾ইຎమ឴ݐᧆ҅ݢզ᭗ᬦ this.http ឴ݐ̶
JavaScript 'use strict';
import Base from './base.js';
export default class extends Base { indexAction(){ let http = this.http; } }
ጱંොဩ᧗ᥠ API -> http̶ތԭ http ۱ى
REST API
දັᒵ̶֢ڢӞԶ REST ളݗᕳᒫӣොֵአ҅ᬯԶളݗ෫क़Ԓ੪ฎी׀ᶱፓ᯾ᵱᥝ҅ײํ
දڢ᭗አጱीํތտᛔۖګԧ REST Controller҅ᧆഴ׀Ἃᅸ҅ThinkJS ྲڞইຎಋૡ݄ԡٟᬯԶ֢ ᧗ᥠ ᬯ᯾̶̶ٍ֛ګᒵ̶֢ইຎᬯԶ֢ӧჿ᪃ᵱ҅Ԟݢզᬰᤈਧັ this ֢አऒጱᳯ᷌
හᘏ Promise̶ᬯԶ॒ቘොୗ᮷ڍ᧣Node.js ᯾ᕪଉํஉग़ྍ֢҅ᘒྍ֢ଉᥠጱ॒ቘොୗฎֵአࢧ ဩฎࣁᶮ᮱ਧԎӞӻݒᰁ҅ਖ਼ېጱ॒ቘܔහٖ෫ဩፗളֵአ this ҅ᓌڍ᧣Ӟ੶֢አऒ҅ᛘࣁࢧےտी හֵٖአᬯӻݒᰁ̶ইғڍ᧣ᕳᬯӻݒᰁ҅ᆐݸࣁࢧthis ᩙ
JavaScript module.exports = think.controller({ indexAction: function(){ self හ᯾᮷ֵአڍ᧣self҅ᆐݸࣁݸᶎጱࢧ ᕳݒᰁᩙ this //ᬯ᯾ਖ਼ this; = self var this.model('user').find().then(function(data){ return self.model('article').where({user_id: data.id}).select(); }).then(function(data){ self.success(data); }) } })
ইຎྯӻ Action ᯾᮷ᥝֵአᘏಋૡٟӞӻ var self = this ҅۠ྲἋᅸ̶ԅԧᥴ٬ᬯӻᳯ᷌҅ ԧӞӻ݇හ҅ᬯӻ݇හᒵݶԭ var self = this ٍ֛҅ইӥғ׀ThinkJS ࣁ Action ᯾ፗള JavaScript module.exports = think.controller({ this = self var ᒵݶԭ self හ݇// indexAction: function(self){ this.model('user').find().then(function(data){ return self.model('article').where({user_id: data.id}).select(); }).then(function(data){ self.success(data); }) } }) this ဩฎവគֵአ ES6 ᯾ጱ Generator Function Arrow Function҅ᬯ੪ݢզବᥴ٬ې୮ᆐๅঅጱᥴ٬ ֢አऒጱᳯ̶᷌
አ Generator Functionֵ
JavaScript export default class extends think.controller.base { * indexAction(){ let data = yield this.model('user').find(); let result = yield this.model('article').where({user_id: data.id}).select(); this.success(result); } }
አ Arrow Functionֵ
JavaScript module.exports = think.controller({ indexAction: function(){ this.model('user').find().then(data => { return this.model('article').where({user_id: data.id}).select(); }).then(data => { this.success(data); }) } })
ڊJSON ᬌ
ളݗฎڹJSON ໒ୗጱහഝ҅ଚӬտํຽᦩᤒก୮ ڊӞԶളݗ҅ᬯԶളݗӞᛱ᮷ฎፗളᬌ׀ᶱፓӾᕪଉᥝ ԧ this.success ׀᯾ګഴ̶ڊᵋ፳ളݗӞ᩸ᬌ௳מኞଉ҅ᵱᥝਖ਼ଫጱᲙݎྋଉ̶ইຎވ ᬯጱളݗහഝ̶ڊthis.fail ොဩᬌ
ྋଉጱ JSONڊᬌ ྋଉጱളݗහഝ҅ইғڊݢզ᭗ᬦ this.success ොဩᬌ
JavaScript export default class extends think.controller.base { indexAction(){ let data = {name: "thinkjs"}; this.success(data); } }
ᕮຎԅ {errno: 0, errmsg: "", data: {"name": "thinkjs"}} ҅ਮಁᒒݢզ᭗ᬦ errno ฎڊᬌ ଉ̶ํވളݗฎڹෙ୮ڣԅ 0 ވ
ጱ JSON௳מᲙํތڊᬌ
ጱളݗහഝ҅ইғ௳מᲙํތڊݢզ᭗ᬦ this.fail ොဩᬌ
JavaScript export default class extends think.controller.base { indexAction(){ ௳מ//ਧᲙݩᲙ error'); 'connect this.fail(1000, } }
ളڹෙ errno य़ԭ 0҅੪Ꭳ᭲୮ڣᕮຎԅ {errno: 1000, errmsg: "connect error"} ҅ਮಁᒒڊᬌ ̶௳מጱᲙٍ֛کݗํଉ҅ଚӬ᭗ᬦ errmsg ೭
௳מᯈᗝᲙݩᲙ
מྲἋᅸ҅ྲঅጱොୗฎᲙݩᲙ۠௳מ᮷ᥝਧᲙݩᲙײᲙጱڊইຎྯӻࣈොᬌ ໑ഝᲙݩᛔۖݐ̶௳מݝᥝਧᲙݩ҅ᲙײጱڊࣁӞӻࣈොᯈᗝ҅ᆐݸᬌ௳
ඪ೮ࢵᴬ۸҅ಅզᯈᗝනࣁ src/common/config/locale/[lang].js կӾ̶ইғ௳מᲙ
JavaScript export default { 10001: 'get data error' }
̶௳מଫጱᲙک᭗ᬦӤᶎጱᯈᗝݸ҅ಗᤈ this.fail(10001) տᛔۖݐ
অጱᲙݩ
ᲙݩڊՈӧᚆፗᥡጱ፡֕҅௳מྋᏟጱᲙݩᲙڊࣁᑕଧ᯾ಗᤈ this.fail(10001) ᡱᆐᚆᬌ ฎՋԍ̶௳מଫጱᲙ :ই̶௳מԅᲙݩᲙᬯݢզਖ਼ key ᯈᗝԅय़ٟਁᒧԀ҅
JavaScript export default { ᕚํපښᶳԅय़ٟਁᒧᘏӥ //key error'] data 'get [1234, GET_DATA_ERROR: }
̶௳מଫጱᲙݩᲙکಗᤈ this.fail('GET_DATA_ERROR') Ԟտᛔۖݐ
໒ୗᯈᗝ
දᯈᗝץጱ key ԅ errmsg ̶ইຎӧჿ᪃ᵱጱᦾ҅ݢզ௳מጱᲙݩጱ key ԅ errno ҅Კڊἕᦊᬌ կ src/common/config/error.js ̶
JavaScript export default { key: 'errno', //error number msg: 'errmsg', //error message }
ጱ JSON௳מᲙތӧ۱ڊᬌ
JSON̶ ڊerrno errmsg ጱᦾ҅ݢզ᭗ᬦ this.json ොဩᬌ ތጱ JSON හഝ᯾ӧమ۱ڊইຎᬌ ইғ
JavaScript export default class extends think.controller.base { indexAction(){ this.json({name: 'thinkjs'}); } }
ᚆۑଉአ
឴ݐ GET ݇හ
ݢզ᭗ᬦ get ොဩ឴ݐ GET ݇හ҅ইғ
JavaScript export default class extends think.controller.base { indexAction(){ let name = this.get('name'); ݇හ GET //឴ݐಅํ this.get(); = allParams let } } ԅᑮਁᒧԀ̶ইຎ݇හӧਂࣁ҅ᮎԍ
឴ݐ POST ݇හ
ݢզ᭗ᬦ post ොဩ឴ݐ POST ݇හ҅ইғ
JavaScript export default class extends think.controller.base { indexAction(){ let name = this.post('name'); ݇හ POST //឴ݐಅํ this.post(); = allParams let } }
ԅᑮਁᒧԀ̶ইຎ݇හӧਂࣁ҅ᮎԍ
឴ݐӤփጱկ
ݢզ᭗ᬦ file ොဩ឴ݐӤփጱկ҅ইғ
JavaScript export default class extends think.controller.base { indexAction(){ let file = this.file('image'); //឴ݐಅํӤփጱկ this.file(); = allFiles let } }
ӥᶎጱંғތฎӻ҅۱ᬬࢧ
JavaScript { ݷᑍྦྷਁܔ//ᤒ 'file', fieldName: //ܻতጱկݷ filename, originalFilename: ᴻڢ᧗ᕮտᤩڞވᶱፓ᯾ጱፓ୯҅کጱԁ᪠ஆֵ҅አᵱᥝਖ਼ٌᑏۖਂכ//կ filepath, path: size: 1000 //կय़ੜ }
̶ {} ԅӞӻᑮইຎկӧਂࣁ҅ᮎԍ
ڊJSONP ໒ୗහഝᬌ
JSONP ໒ୗጱහഝ҅callback ጱ᧗݇හݷἕᦊԅ callback ̶ইຎᵱ ڊݢզ᭗ᬦ this.jsonp ොဩᬌ දᯈᗝ callback_name ਠ౮̶ץද᧗݇හݷ҅ݢզ᭗ᬦץᥝ
ๅग़ොဩ ฎ GET ᧗ވฎڹisGet() ୮ ฎ POST ᧗ވฎڹisPost() ୮ isAjax() ฎވฎ AJAX ᧗ ip() ឴ݐ᧗አಁጱ ip Ӟӻ urlکredirect(url) ᪡ හഝ҅տᛔۖ᧣አ JSON.stringifyڊwrite(data) ᬌ ጱ http ᧗ڹend(data) ᕮ୮ ጱ Content-Typeىᭆ JSON ፘݎJSON හഝ҅ᛔۖ ڊjson(data) ᬌ JSONP හഝ҅᧗݇හݷἕᦊԅ callback ڊjsonp(data) ᬌ Ӟӻྋଉጱ JSON හഝ҅හഝ໒ୗԅڊsuccess(data) ᬌ {errno: 0, errmsg: "", data: data} ӞӻᲙጱ JSON හഝ҅හഝ໒ୗԅڊfail(errno, errmsg, data) ᬌ {errno: errno_value, errmsg: string, data: data} download(file) ӥկ assign(name, value) ᦡᗝཛྷᇇݒᰁ Ӟӻཛྷᇇڊdisplay() ᬌ fetch() ວཛྷᇇଚ឴ݐٖ cookie(name, value) ឴ݐᘏᦡᗝ cookie session(name, value) ឴ݐᘏᦡᗝ session header(name, value) ឴ݐᘏᦡᗝ header action(name, data) ᧣አٌ՜ Controller ጱොဩ҅ݢզཛྷࣘ model(name, options) ឴ݐཛྷࣳਫֺ
ᤒ᧗ᥠ API -> Controller̶ڜਠෆොဩ
ᥤࢶ
ᥤࢶܨཛྷᇇ҅ἕᦊጱ໑ፓ୯ԅ view/ ̶
ᥤࢶկ
̶ _֢.htmlګԅ ཛྷࣘ/ഴڞᥤࢶկἕᦊጱݷᥢ
҅ ฎ article ֢҅ฎ detailګই URL home/article/detail ᥴຉݸጱཛྷࣘฎ home ҅ഴ ᮎԍଫጱᥤࢶկԅ home/article_detail.html ̶
ᥤࢶᯈᗝ
දғץᥤࢶἕᦊᯈᗝইӥ҅ݢզࣁᯈᗝկ src/common/config/view.js Ӿ JavaScript export default { type: 'ejs', //ཛྷᇇක Content-Type ᭆጱݎཛྷᇇڊ//ᬌ 'text/html', content_type: //կጱಘݷ '.html', file_ext: ֢ԏᳵጱᬳളᒧګ//ഴ '_', file_depr: root_path: think.ROOT_PATH + '/view', //ᥤࢶկጱ໑ፓ୯ adapter: { //ཛྷᇇකᵱᥝጱᯈᗝᶱ ཛྷක᷐क़ᯈᗝ ejs //ֵአ {}, ejs: ཛྷක᷐क़ᯈᗝ nunjucks //ֵአ {} nunjucks: } };
ဳ ғ 2.0.6 ᇇত݄ᴻԧ options ᯈᗝᶱֵ҅አ adapter դ̶๊
ݢ̶ܨදԅᑮץ ᥤࢶἕᦊ໑ፓ୯ࣁ view/ ̶ইຎమྯӻཛྷࣘํᇿᒈጱᥤࢶፓ୯҅ਖ਼ᯈᗝ root_path
දᬳളᒧץ
֢ԅӞ੶ፓګ֢ԏᳵጱᬳളᒧฎ _ ҅կݷᔄ֒ԅ index_index.html ҅ইຎమਖ਼ഴګἕᦊഴ ̶ / දԅץ୯ጱᦾ҅ইғ index/index.html ҅ݢզਖ਼ᬳളᒧ
JavaScript export default { file_depr: '/' }
දཛྷකᯈᗝץ
දᯈᗝ adapter ᯾ଫਁྦྷ̶ইғץදཛྷකጱӞԶᯈᗝ҅ݢզץইຎమ
JavaScript export default { adapter: { ejs: { <& <& දԅץ//ਖ਼ਧኴᒧ '&' delimiter: }, nunjucks: { trimBlocks: false, //ӧԎ prerender: function(nunjucks, env){} //ᰒnunjucksཛྷጱᬦᄁ } } }
ཛྷᇇක ThinkJS ἕᦊඪ೮ጱཛྷᇇකํғ ejs ҅ jade ҅ swig nunjucks ҅ἕᦊཛྷᇇකԅ ejs ҅ݢզ දԅٌ՜ጱཛྷᇇක̶ץ໑ഝᵱᥝ ejs
ਧኴᒧ
ද҅ইғץදਧኴᒧ҅ݢզ᭗ᬦᯈᗝ adapter ᯾ጱ ejs ץejs ἕᦊጱਧኴᒧฎ <% %> ̶ইຎమ
JavaScript export default { adapter: { ejs: { <& <& දԅץ//ਖ਼ਧኴᒧ '&' delimiter: } } }
ڊݒᰁᬌ
<%data.name =%> ڊԎᬌ <%data.name -%> ڊӧԎᬌ ဳ᯽ <%# data.name%>
ෙڣկ
<%if(data.name === '1'){%>
...
<%}else if(data.name === '2'){%>...
<%}else{%>...
<%}%>ሾ
<%list.forEach(function(item){%>
ᬦᄁ
/ᚆ҅ݢզࣁ src/common/bootstrapۑᚆԧ҅ইຎᵱᥝӞԶᬦᄁۑෛᇇጱ ejs ૪ᕪӧٚඪ೮ᬦᄁጱ හ̶ڍහ҅ཛྷ᯾ݢզፗളֵአᬯԶڍੴق᯾ਧԎӞԶ አկ
̶فአጱཛྷᇇᇿᒈ౮Ӟӻկ҅ᆐݸ᭗ᬦ include لejs ӧඪ೮ཛྷᇇᖀಥ̶֕ݢզਖ਼
<%include inc/header.html%>
տಸᲙ̶ڞވ҅Ӿᩙګဳ ғejs ཛྷᇇֵአጱݒᰁᵱᥝࣁഴ
ๅग़ ejs ֵአ᧗ᥠ ᬯ᯾̶ nunjucks
ᚆଉ୩य़҅॔ᶱፓୌᦓֵአᧆཛྷᇇක̶ۑnunjucks ฎӞྃᔄ֒ԭ jinja2 ጱཛྷᇇක҅
ਧኴᒧ
ࣘᕆਧኴᒧԅ {% %} ҅ݒᰁਧኴᒧԅ {{ }} ҅ဳ᯽ਧኴᒧԅ <# #> ̶ইғ
Markup {{ username }}
{% block header %} This is the default content {% endblock %}
ڊݒᰁᬌ
ጱݒᰁտᛔۖԎ҅ইຎӧమᤩԎ҅ݢզ᭗ᬦڊݒᰁ҅ἕᦊᬌڊݢզ᭗ᬦ {{ username }} ᬌ {{ username | safe }} ॒ቘ̶
ཛྷᇇᖀಥ
ᆿᕆཛྷᇇғ Markup {% block header %} This is the default content {% endblock %}
ᕆཛྷᇇғ
Markup {% extends "parent.html" %}
{% block left %} This is the left side! {% endblock %}
{% block right %} This is the right side! {% endblock %}
ෙڣկ
Markup {% if hungry %} I am hungry {% elif tired %} I am tired {% else %} I am good! {% endif %}
ሾ Markup
Posts
- {% for item in items %}
- {{ item.title }} {% else %}
- This would display if the 'item' collection were empty {% endfor %}
አ᧗ᥠ ᬯ᯾̶ֵٍ֛ jade jade ཛྷᇇֵአොୗ᧗ᥠ ᬯ᯾̶ swig swig ཛྷᇇֵአොୗ᧗ᥠ ᬯ᯾̶
ᚆۑᬦᄁᒵےႲ
ᚆ҅ݢզࣁཛྷᯈᗝկۑᬦᄁᒵےswig ҅ nunjucks ᒵஉग़ཛྷක᮷ඪ೮Ⴒ prerender ᯈᗝਠ౮̶ইғ ےsrc/common/config/view.js Ӿଫጱ adapter Ⴒ
JavaScript export default { adapter:{ nunjucks: { prerender: function(nunjucks, env){ Ӟӻᬦᄁ҅ᬯݢզࣁཛྷ᯾ֵአԧےႲ// env.addFilter('filter_foo', function(){
}); } } } }
ᚆฎࣁᇇ 2.0.5 Ӿෛीጱ̶ۑဳ ғ ᧆ
ಘཛྷᇇක
ཛྷᇇකֵአ Adapter ਫሿ̶ইຎᶱፓ᯾ᵱᥝֵአٌ՜ཛྷᇇක҅ݢզ᭗ᬦ Adapter ᬰᤈಘٍ֛҅᧗ᥠ ᬯ ᯾̶ ݒᰁᩙ
̶Ӿݢզ᭗ᬦ assign ොဩᬰᤈݒᰁᩙګഴ
ӻݒᰁܔᩙ
JavaScript export default class extends think.controlle.base { indexAction(){ this.assign('title', 'ThinkJS ਥᗑ'); } }
ग़ӻݒᰁᩙ
JavaScript export default class extends think.controlle.base { indexAction(){ this.assign({ title: 'ThinkJS ਥᗑ', author: 'thinkjs' }); } }
឴ݐᩙ
ইғ̶ݸԞݢզ᭗ᬦ assign ឴ݐᩙᬦጱݒᰁᩙ
JavaScript export default class extends think.controlle.base { indexAction(){ this.assign('title', 'ThinkJS ਥᗑ'); let title = this.assign('title'); } }
ཛྷᇇວ
ݢզ᭗ᬦ display ොဩᬰᤈཛྷᇇວ̶ইຎӧփٍ֛ጱཛྷᇇկ᪠ஆ҅տᛔۖັತ̶ইғ JavaScript export default class extends think.controller.base { indexAction(){ this.display();// render home/index_index.html } }
ԭ display ොဩጱᧇᕡֵአ᧗ᥠ ᬯ᯾̶ىԞݢզਧٍ֛ጱཛྷᇇկᬰᤈວ҅
឴ݐວݸጱٖ
ཛྷᇇ҅ᘒฎమ឴ݐວݸጱཛྷᇇٖ҅ᮎԍݢզ᭗ᬦ fetch ොဩ឴ݐ̶ڊӧమඪ೮ᬌײইຎํ
ES6 ොୗ
JavaScript export default class extends think.controller.base { * indexAction(){ let content = yield this.fetch(); ... } }
ୌᔄጱොୗڠாۖ
JavaScript module.exports = think.controller({ indexAction: function(){ this.fetch().then(function(content){ ... }) } })
ԭ fetch ොဩጱᧇᕡֵአොୗ᧗ᥠ ᬯ᯾̶ى
ࢵᴬ۸
ࢵᴬ۸ݸ҅ᥤࢶ᪠ஆտग़Ӟ੶ࢵᴬ۸ጱፓ୯̶ইғٍ֛ጱᥤࢶ᪠ஆݒԅۖސ view/zh-CN/home/index_index.html ٌ҅Ӿ zh-CN ԅݷ̶
ᚆ -> ࢵᴬ۸̶ۑԭইຎֵአࢵᴬ۸᧗ᥠ ಘى
ग़Ԇ᷌
ᦡᗝग़Ԇ᷌ݸ҅ᥤࢶ᪠ஆտग़Ӟ੶ग़Ԇ᷌ጱፓ୯̶ইғٍ֛ጱᥤࢶ᪠ஆݒԅ view/default/home/index_index.html ٌ҅Ӿ default ԅԆ᷌ݷᑍ̶
ጱԆ᷌҅ᦡᗝԆ᷌Ӟᛱฎ᭗ᬦ middleware ਫሿ̶ڹݢզ᭗ᬦ http.theme ොဩᦡᗝ୮
ᚆ - Middleware̶ۑ᧗ᥠ ಘ௳מԭ middleware ๅग़ى
ἕᦊཛྷᇇݒᰁ
, ԅԧݢզࣁཛྷᇇ᯾உොጱ឴ݐӞԶ᭗አጱݒᰁ҅ຝᛔۖݻཛྷᇇ᯾ဳٙԧ http , controller config ᒵݒᰁ҅ᬯԶݒᰁݢզࣁཛྷᇇ᯾ፗളֵአ̶
ද̶ץӥᶎጱդᎱᐏֺ᮷ฎचԭ ejs ཛྷᇇකጱٌ҅՜ጱཛྷᇇකӥᵱᥝ໑ഝፘଫጱဩᬰᤈ http
ཛྷᇇ᯾ݢզፗളֵአ http ӥጱંොဩ̶ controller
ཛྷᇇ᯾ݢզፗളֵአ controller ӥጱંොဩ̶
JavaScript export default class extends think.controller.base { indexAction(){ this.navType = 'home'; } }
ԧં navType ҅ᮎԍཛྷᇇ᯾੪ݢզፗള᭗ᬦ controller.navType ֵےႲګഴڹAction ᯾ᕳ୮ አ̶
<%if(controller.navType === 'home')%>
᭗ᬦ config ݢզࣁཛྷᇇӾፗളଫጱᯈᗝ҅ইғ
<%if(config.name === 'text'){%>
<%}%> _ ࢵᴬ۸ොဩ
ࣁᬯԶ҅ࣁཛྷᇇӾݢզፗള᭗ᬦ _ ොဩ឴ݐଫࣈ۸ጱ src/common/config/locales/[lang].js ӾਧԎ̶
<%= _('title')%>
᧗ᥠ ᬯ᯾̶௳מጱىๅग़ࢵᴬ۸ፘ
ᯈᗝ
ސۓԧᅎၚጱᯈᗝ҅ݢզࣁӧݶጱཛྷࣘӧݶጱᶱፓሾहӥֵአӧݶጱᯈᗝ҅ӬᬯԶᯈᗝࣁ๐׀ThinkJS ੪૪ᕪኞප̶ۖ
ᕳ٫ധ̶ᯈᗝӾ҅ᬯਖ਼տᤩӥӞӻ http ᦡᗝጱکᦡᗝဳғӧݢਖ਼Ӟӻ http ᧗Ӿጱᐺํ
ᶱፓཛྷࣘ
ጱ҅ݢզࣁྯӻཛྷࣘӥਧԎӧݶጱᯈᗝ̶ٌӾ common ཛྷࣘӥਧړښୌጱᶱፓฎೲཛྷࣘڠThinkJS ἕᦊ ԎӞԶ᭗አጱᯈᗝٌ҅՜ཛྷࣘӥᯈᗝտᖀಥ common ӥጱᯈᗝ̶ইғ home ཛྷࣘӥጱ๋ᕣᯈᗝฎਖ਼ common home ཛྷࣘӥᯈᗝݳଚጱᕮຎ̶
ᶱፓሾह
ӥጱᯈᗝᵱᥝ̶٭ThinkJS ἕᦊඪ೮ 3 ᐿᶱፓሾह҅ݢզ໑ഝӧݶጱሾहᬰᤈᯈᗝ҅զჿ᪃ӧݶఘ
development ݎሾह testing ၥᦶሾह production ᕚӤሾह
ݢ̶ܨ ݗկ Ӿᦡᗝ҅ᦡᗝ envف አߺᐿሾहݢզࣁֵڹᶱፓ᯾Ԟݢզಘٌ՜ጱሾह҅୮
ਧԎᯈᗝկ config/config.js
ਂනӞԶचጱᯈᗝ҅ইғ JavaScript export default { port: 8360, host: '', encoding: 'utf-8', ... }
config/[name].js
ᚆጱᯈᗝ҅ইғ db.js ԅහഝପᯈᗝ҅ redis ԅ redis ᯈᗝ̶ۑනٍ֛ӻᇿᒈਂ
JavaScript // db.js export default { type: 'mysql', host: '127.0.0.1', port: '', name: '', user: '', ... };
config/env/[mode].js
ӧݶᶱፓሾहጱ૧۸ᯈᗝ҅ইғ env/development.js ҅ env/testing.js ҅ env/production.js
JavaScript // config/env/development.js export default { port: 7777, db: { //ݎཛྷୗӥහഝପᯈᗝ type: 'mysql', host: '127.0.0.1', port: '', ... } }
ᚆۑදӞӻᇿᒈץইຎᥝײဳ ғӧݶᶱፓሾह૧۸ᯈᗝӞᛱӧฎஉग़҅ಅզනࣁӞӻկӾਧԎ̶ᬯ දහഝପᯈᗝᵱᥝਖ਼හഝପଫጱݷᑍץᚆଫጱ key ଃӤ̶ইғӤᬿդᎱ᯾ጱۑጱᯈᗝ҅੪ᵱᥝਖ਼ᇿᒈ db ଃӤ̶ config/locale/[lang].js
̶ ࢵᴬ۸۱ᯈᗝ҅ইғ locale/en.js ҅ locale/zh-CN.js य़ੜ̶ٟړ܄ᯈᗝ໒ୗአ key: value ጱ୵ୗ҅ଚӬ key ӧ
ᯈᗝկے
ጱᯈᗝկ҅տೲզӥᶲଧᬰᤈݐғڦຝඪ೮ग़ᐿᕆ
ᯈᗝ -> ཛྷࣘӥጱᯈᗝولᯈᗝ -> ᶱፓཛྷୗӥጱولຝἕᦊጱᯈᗝ -> ᶱፓཛྷୗӥຝᯈᗝ -> ᶱፓ
ᯈᗝݐ
᭗ᬦ config ොဩ឴ݐ
ࣁ Controller҅Logic҅Middleware ᒵࣈොݢզ᭗ᬦ this.config ឴ݐ̶ইғ
JavaScript //ݐහഝପጱಅํᯈᗝ this.config('db'); = db let db.host ᯈᗝ҅ᒵݶԭ host //ݐහഝପጱ this.config('db.host'); = host let
᭗ᬦ http Ӥጱ config ොဩ឴ݐ
ጱᯈᗝ҅ইғىhttp Ԟํ config ොဩአ឴ݐፘ
JavaScript let db = http.config('db');
՜ࣈොᯈᗝݐٌ
ጱᯈᗝғى՜ࣈොݢզ᭗ᬦ think.config ݐፘٌ
JavaScript //ݐ᭗አཛྷࣘӥጱහഝପᯈᗝ think.config('db'); = db let ཛྷࣘӥහഝପᯈᗝ home //឴ݐ 'home'); undefined, think.config('db', = db1 let
෫ဩ᭗ᬦ config ොဩᘏ http Ӥጱ config ොဩ឴ݐᶋ᭗አཛྷࣘӥጱᯈ҅ڹဳ ғ᪠ኧᥴຉ ੪ֵአጱᯈᗝᵱᥝਧԎࣁ᭗አཛྷࣘ᯾̶ڹᗝ҅ಅզ᪠ኧᥴຉ
ᔮᕹἕᦊᯈᗝ env
ᶱፓཛྷୗӥጱᯈᗝ҅ config/env/development.js ̶ JavaScript export default { auto_reload: true, log_request: true, gc: { on: false }, error: { detail: true } }
config/env/testing.js config/env/produciton.js ෫ἕᦊᯈᗝ̶ locale
ࢵᴬ۸۱ᯈᗝ҅ἕᦊጱᯈᗝইӥғ
JavaScript // config/locale/en.js export default { CONTROLLER_NOT_FOUND: 'controller `%s` not found. url is `%s`.', CONTROLLER_INVALID: 'controller `%s` is not valid. url is `%s`', ACTION_NOT_FOUND: 'action `%s` not found. url is `%s`', ACTION_INVALID: 'action `%s` is not valid. url is `%s`', WORKER_DIED: 'worker `%d` died, it will auto restart.', MIDDLEWARE_NOT_FOUND: 'middleware `%s` not found', ADAPTER_NOT_FOUND: 'adapter `%s` not found', GCTYPE_MUST_SET: 'instance must have gcType property', CONFIG_NOT_FUNCTION: 'config `%s` is not a function', CONFIG_NOT_VALID: 'config `%s` is not valid', PATH_EMPTY: '`%s` path muse be set', PATH_NOT_EXIST: '`%s` is not exist', TEMPLATE_NOT_EXIST: 'can\'t find template file `%s`', PARAMS_EMPTY: 'params `%s` value can\'t empty', PARAMS_NOT_VALID: 'params `{name}` value not valid', FIELD_KEY_NOT_VALID: 'field `%s` in where condition is not valid', DATA_EMPTY: 'data can not be empty', MISS_WHERE_CONDITION: 'miss where condition', INVALID_WHERE_CONDITION_KEY: 'where condition key is not valid', WHERE_CONDITION_INVALID: 'where condition `%s`:`%s` is not valid', TABLE_NO_COLUMNS: 'table `%s` has no columns', NOT_SUPPORT_TRANSACTION: 'table engine is not support transaction', DATA_MUST_BE_ARRAY: 'data is not an array list', PARAMS_TYPE_INVALID: 'params `{name}` type invalid', DISALLOW_PORT: 'proxy on, cannot visit with port', SERVICE_UNAVAILABLE: 'Service Unavailable', validate_required: '{name} can not be blank', validate_contains: '{name} need contains {args}', validate_equals: '{name} need match {args}', validate_different: '{name} nedd not match {args}', validate_after: '{name} need a date that\'s after the {args} (defaults to now)', validate_alpha: '{name} need contains only letters (a-zA-Z)', validate_alphaDash: '{name} need contains only letters and dashes(a-zA-Z_)', validate_alphaNumeric: '{name} need contains only letters and numeric(a-zA-Z0-9)', validate_alphaNumericDash: '{name} need contains only letters, numeric and dash(a-zA-Z0-9_)', validate_ascii: '{name} need contains ASCII chars only', validate_base64: '{name} need a valid base64 encoded', validate_before: '{name} need a date that\'s before the {args} (defaults to now)', validate_byteLength: '{name} need length (in bytes) falls in {args}', validate_creditcard: '{name} need a valid credit card', validate_currency: '{name} need a valid currency amount', validate_date: '{name} need a date', validate_decimal: '{name} need a decimal number', validate_divisibleBy: '{name} need a number that\'s divisible by {args}', validate_email: '{name} need an email', validate_fqdn: '{name} need a fully qualified domain name', validate_float: '{name} need a float in {args}', validate_fullWidth: '{name} need contains any full-width chars', validate_halfWidth: '{name} need contains any half-width chars', validate_hexColor: '{name} need a hexadecimal color', validate_hex: '{name} need a hexadecimal number', validate_ip: '{name} need an IP (version 4 or 6)', validate_ip4: '{name} need an IP (version 4)', validate_ip6: '{name} need an IP (version 6)', validate_isbn: '{name} need an ISBN (version 10 or 13)', validate_isin: '{name} need an ISIN (stock/security identifier)', validate_iso8601: '{name} need a valid ISO 8601 date', validate_in: '{name} need in an array of {args}', validate_notIn: '{name} need not in an array of {args}', validate_int: '{name} need an integer', validate_min: '{name} need an integer greater than {args}', validate_max: '{name} need an integer less than {args}', validate_length: '{name} need length falls in {args}', validate_minLength: '{name} need length is max than {args}', validate_maxLength: '{name} need length is min than {args}', validate_lowercase: '{name} need is lowercase', validate_mobile: '{name} need is a mobile phone number', validate_mongoId: '{name} need is a valid hex-encoded representation of a MongoDB ObjectId', validate_multibyte: '{name} need contains one or more multibyte chars', validate_url: '{name} need an URL', validate_uppercase: '{name} need uppercase', validate_variableWidth: '{name} need contains a mixture of full and half-width chars', validate_order: '{name} need a valid sql order string', validate_field: '{name} need a valid sql field string', validate_image: '{name} need a valid image file', validate_startWith: '{name} need start with {args}', validate_endWidth: '{name} need end with {args}', validate_string: '{name} need a string', validate_array: '{name} need an array', validate_boolean: '{name} need a boolean', validate_object: '{name} need an object' } config
चᯈᗝ҅ config/config.js ̶
JavaScript export default { ጱᒒݗލፊۓ//๐ 8360, port: host ጱލፊۓ//๐ '', host: encoding: 'utf-8', //ᶱፓᖫᎱ ᖗ҅᪠ኧᥴຉӾֵአڹ݄ᴻጱ //pathname '', pathname_prefix: ݄ᴻጱݸᖗ҅᪠ኧᥴຉӾֵአ //pathname '.html', pathname_suffix: ᬰᤈդቘ server web ᒵ nginx አֵވ//ฎ false, proxy_on: hook_on: true, //ฎވސ hook cluster_on: false, //ฎވސ cluster
service_on: true, //Service available timeout: 120, //120 seconds ཛྷୗӥֵአ දጱկ҅developmentץے//ᛔۖ᯿ෛ false, auto_reload:
ᳮᧆᯈᗝىӥݢզސ porxy_on ቘᶉாᩒრ᧗॒҅ވฎ // true, resource_on: ڞ//ᶉாᩒრጱྋ /^(static\/|[^\/]+\.(?!js|html)\w+$)/, resource_reg:
route_on: true, //ฎވސᛔਧԎ᪠ኧ pid ጱۓᦕ୯๐ވ//ฎ false, log_pid: log_request: false, //ฎވܦ᧗ጱ෭ப
ۓ๐ۖސ//ᛔਧԎ undefined, create_server: ॒ቘᒵ gzip ॒ቘොୗ҅ݢզᬰᤈٖڊ//ᛔਧԎᬌ undefined, output_content: ᤒڜ//ᐬአጱཛྷࣘ [], deny_module_list: default_module: 'home', //ἕᦊཛྷࣘ ګ//ἕᦊጱഴ 'index', default_controller: default_action: 'index', //ἕᦊጱ Action ݷᑍ callback ᧗ጱ //jsonp 'callback', callback_name: Content-Type ᦡᗝጱڊᬌ //json 'application/json', json_content_type: //ৼऒݷ᮱ᗟᯈᗝ {} subdomain: } cache
ᖨਂᯈᗝ҅ config/cache.js ̶
JavaScript export default { type: 'file', //ᖨਂොୗ ᖗڹ//ᖨਂݷᑍ 'thinkjs_', prefix: timeout: 6 * 3600, //6 hours //կᖨਂཛྷୗӥᖨਂٖਂනጱፓ୯ '/cache', + runtimePrefix path: path_depth: 2, //ৼፓ୯Ⴎଶ //ᖨਂկጱಘݷ '.json' file_ext: }; cookie cookie ᯈᗝ҅ config/cookie.js ̶
JavaScript export default { domain: '', // cookie domain path: '/', // cookie path httponly: false, //ฎވ httponly ӥֵአ https ࣁވ//ฎ false, secure: timeout: 0 //cookie ํපᳵ }; db
හഝପᯈᗝ҅ config/db.js ̶ JavaScript export default { type: 'mysql', //හഝପᔄࣳ host: '127.0.0.1', //හഝପ host //ᒒݗ '', port: //හഝପݷᑍ '', name: //ᨴݩ '', user: pwd: '', //ੂᎱ ᖗڹ//හഝᤒ 'think_', prefix: encoding: 'utf8', //හഝପᖫᎱ nums_per_page: 10, //Ӟᶭἕᦊහ ݙ sql ᦕ୯ވ//ฎ true, log_sql: ௳מᦕ୯ᬳളහഝପጱވฎ // true, log_connect: cache: { // ັᧃහഝᖨਂᯈᗝ on: true, type: '', timeout: 3600 } }; error
̶ ᯈᗝ҅ config/error.js௳מᲙ
JavaScript export default { key: 'errno', //error number msg: 'errmsg', //error message value: 1000 //default errno }; gc
ᖨਂ̵Sessionᒵ࣯॒࣍ቘᯈᗝ҅ config/gc.js ̶
JavaScript export default { on: true, //ฎވސ࣯࣍ࢧත॒ቘ interval: 3600, // ॒ቘᳵᳵᵍ҅ἕᦊԅӞӻੜ ᬰᤈ࣯࣍ࢧත॒ቘڞtrue҅ //ইຎᬬࢧ function(){ filter: let hour = (new Date()).getHours(); if(hour === 4){ return true; } } }; hook hook ᯈᗝ҅ config/hook.js ̶
JavaScript export default { request_begin: [], payload_parse: ['parse_form_payload', 'parse_single_file_payload', 'parse_json_payload', 'parse_querystring_payload' payload_validate: ['validate_payload'], resource: ['check_resource', 'output_resource'], route_parse: ['rewrite_pathname', 'subdomain_deploy', 'route'], logic_before: ['check_csrf'], logic_after: [], controller_before: [], controller_after: [], view_before: [], view_template: ['locate_template'], view_parse: ['parse_template'], view_after: [], response_end: [] }; post post ᧗ጱᯈᗝ҅ config/post.js ̶
JavaScript export default { json_content_type: ['application/json'], max_file_size: 1024 * 1024 * 1024, //1G max_fields: 100, max_fields_size: 2 * 1024 * 1024, //2M, ajax_filename_header: 'x-filename', file_upload_path: runtimePrefix + '/upload', file_auto_remove: true }; redis redis ᯈᗝ҅ config/redis.js ̶ JavaScript export default { host: '127.0.0.1', port: 6379, password: '', timeout: 0, log_connect: true }; memcache memcache ᯈᗝ҅ config/memcache.js ̶
JavaScript export default { host: '127.0.0.1', //memcache host port: 11211, username: '', // password: '', timeout: 0, //ᖨਂ०පᳵ log_connect: true }; session session ᯈᗝ҅ config/session.js ̶
JavaScript export default { name: 'thinkjs', type: 'file', path: runtimePrefix + '/session', secret: '', auth_key: 'think_auth_list', timeout: 24 * 3600, cookie: { // cookie options length: 32 } }; view
ᥤࢶᯈᗝ҅ config/view.js ̶ JavaScript export default { content_type: 'text/html', file_ext: '.html', file_depr: '_', root_path: '', type: 'ejs', options: {} }; websocket websocket ᯈᗝ҅ config/websocket.js ̶
JavaScript export default { on: false, //ฎވސ websocket ֵአጱପ //websocket 'think', type: allow_origin: '', sub_protocal: '', adapter: undefined, path: '', //url path for websocket messages: { // open: 'home/websocket/open', } };
ಘᯈᗝ
ݢ҅ইғܨᶱፓ᯾ݢզ໑ഝᵱᥝಘᯈᗝ҅ಘᯈᗝݝᵱࣁ src/common/config/ ୌᒈଫጱկ
JavaScript // src/common/config/foo.js export default { name: 'bar' }
ᬯ੪ݢզ᭗ᬦ think.config('foo') ឴ݐଫጱᯈᗝԧ̶
᪠ኧ
ጱߺӻ֢҅ᬯฎኧ᪠ኧᥴຉݸ٬ਧጱ̶ګ୮አಁᦢᳯӞӻ URL ๋҅ᕣಗᤈߺӻཛྷࣘӥߺӻഴ
ےᴻԧἕᦊጱᥴຉक़҅ᬮݢզඪ೮ग़ᐿ୵ୗጱᛔਧԎ᪠ኧ҅ᦏ URL ๅ҅ګԧӞॺᅎၚጱ᪠ኧ׀ThinkJS ᓌܔঅ̶ URL ᥴຉԅ pathname
ጱ URL ԅکጱฎӞӻਠෆጱ URL҅ইғᦢᳯᶭᶎ҅ک೭ضᒒḒۓ҅๐ۓ୮አಁᦢᳯ๐ http://www.thinkjs.org/zh-CN/doc/2.0/route.html ̶
̶ ጱ pathname ԅ /zh-CN/doc/2.0/route.htmlکਖ਼ URL ᬰᤈᥴຉ pathname ᬦᄁ
ᶭᶎฎӞӻۖாᶭᶎ҅ڹӞԶӳᥜ̶ྲইғ୮ےԅԧᔱකս۸ᘏӞԶٌ՜ጱܻࢩ҅ URL Ӥտग़ײํ অ̶֕ᬯԶࣁݸᖅጱ᪠ኧᥴຉӾฎ෫አጱ҅ᵱᥝ݄ᴻ̶ےԧ .html ҅ᬯᔱකๅےURL ๋ݸ ֕
ᖗݸᖗٖғڹԧӥᶎጱᯈᗝݢզ݄ᴻ pathname ጱ׀ThinkJS ᯾
JavaScript export default { pathname_prefix: '', pathname_suffix: '.html', }
ද̶ץӤᶎᯈᗝݢզࣁ src/common/config/config.js Ӿᬰᤈ
ٳଗکpathname ᬦᄁտᛔ݄ۖᴻૢݦጱ / ҅ᧆ᭦ᬋӧݑӤᶎጱᯈᗝߥ̶ pathname ᬰᤈᬦᄁݸ҅೭ ጱ pathname ԅ zh-CN/doc/2.0/route ̶
ԅᑮਁᒧԀ̶ڞ ጱ pathnameٳଗکဳ ғইຎᦢᳯጱ URL ฎ http://www.thinkjs.org/ ҅ᮎԍ๋ݸ೭
ৼऒݷ᮱ᗟ
ᚆ᮱ᗟࣁӧݶጱऒݷӥ҅֕դᎱᬮฎࣁӞӻᶱፓӥ̶ইғऒݷۑ୮ᶱፓྲ॔҅ݢᚆ๕ਖ਼ӧݶጱ admin ཛྷࣘӥ̶ کᚆ҅๕ฉۑadmin.example.com ᮱ᗟݸݣᓕቘጱ
ԧইӥጱᯈᗝݢզᬰᤈৼऒݷ᮱ᗟ҅ᧆᯈᗝݢզࣁ config/config.js ᯾ᦡᗝғ׀ThinkJS
JavaScript export default { subdomain: { ཛྷࣘӥ admin کฉ admin.example.com //ᤒᐏਖ਼ 'admin', admin: ... } }
ইᬦᄁݸጱ pathname ԅ group/detail ҅Ӿԧ admin.example.com ᬯӻৼऒݷݸ҅pathname ݒԅ admin/group/detail ̶ ڦ᪠ኧᦩ
᪠ኧᥴຉ
ᬦᄁݸጱ pathname҅ইғڦᦩ හ2/݇හ2݇//֢/݇හ1/݇හ1ګἕᦊ໑ഝ ཛྷࣘ/ഴڦ᪠ኧᦩ ݸጱᕮຎԅғڦpathname ԅ admin/group/detail ҅ᮎԍᦩ
module ԅ admin controller ԅ group action ԅ detail ҅ଫጱොဩݷԅ detailAction
ݸጱᕮຎԅғڦইຎᶱፓ᯾ଚဌํ admin ᬯӻཛྷࣘᘏᬯӻཛྷࣘᤩᐬአԧ҅ᮎԍᦩ
module ԅἕᦊཛྷࣘ home controller ԅ admin action ԅ group ҅ଫጱොဩݷԅ groupAction ݇හԅ {detail: ''}
य़ੜٟ۸
᯾ํ _ ҅տ֢ ᮷տᛔۖԅੜ̶ٟইຎ Action ݸ҅ module ̵ controller Actionڦ᪠ኧᦩ ԅ user_add ҅ᮎԍଫጱ Action ොဩ ԅ index ҅Action ݸጱ ControllerڦᦡᦩӞԶ۸҅ইғ ̶ ݷԅ userAddAction ҅֕ཛྷᇇݷᬮฎ index_user_add.html
᪠ኧἕᦊ
ԅ home ҅controllerӾ module ἕᦊ̶ٌ҅ྌֵአଫጱἕᦊ୮ᥴຉ pathname ဌํଫጱ ̶ ԅ indexԅ index ҅action ἕᦊἕᦊ
ද҅ᯈᗝկ src/common/config/config.js ғץݢզ᭗ᬦӥᶎጱᯈᗝᬰᤈᬯԶ
JavaScript export default { default_module: 'home', default_controller: 'index', default_action: 'index', }
ᛔਧԎ᪠ኧ
፡᩸ӧड़ᓌ၄̶֕҅ܔἕᦊጱ᪠ኧᡱᆐ፡᩸Ⴔศกԧ҅ᥴຉ᩸Ԟஉᓌ
੪ᵱᥝֵአᛔਧԎ᪠ኧᥴຉԧ̶ইғᒍጱᧇᕡᶭᶎ҅ἕᦊ᪠ኧݢᚆײᓌ၄ጱ᪠ኧ҅ᬯےᵱᥝๅײํ ฎғ article/detail/id/10 ҅֕౯ժమᥝጱ URL ฎ article/10 ᬯᐿๅᓌ၄ጱොୗ̶ ސᯈᗝ
ސᛔਧԎ᪠ኧ҅ᵱᥝࣁ src/common/config/config.js ސইӥጱᯈᗝғ
JavaScript export default { route_on: true }
ڞ᪠ኧᥢ
ਧԎٍ֛ጱ᪠ኧԧ҅᪠ኧᯈᗝկԅғڞᛔਧԎ᪠ኧݸ҅੪ݢզ᭗ᬦ᪠ኧᥢސ src/common/config/route.js ҅໒ୗইӥғ
JavaScript export default [ ,["౮ጱpathnameڦᵱᥝᦩ" ,"1ڞᥢ"] } ,"2ڞᥢ"] ,"౮ጱpathnameڦ"get᧗ӥᵱᥝᦩ get: "౮ጱpathnameڦ"post᧗ӥᵱᥝᦩ post: }] ];
ӧᚆ֢ԅڞ᪠ኧӥ҅ྋڞ᮷ฎӞӻහᕟ̶ҁᛗԭԅՋԍӧአ҅ฎࢩԅྋڞဳ ғᛔਧԎ᪠ኧྯӞᥢ ጱ key ፗളֵአ҂
ොୗڦᦩ
ᯈ̶܃ӧࣁݻݸڞ҅ڞԧᧆᶱᥢکᯈ҅ইຎӾ܃ݻݸ᭑Ӟڹԅғڞᯈᥢ܃ᛔਧԎ᪠ኧጱ
᪠ኧᶉா᪠ኧ̶ڞ᪠ኧ҅ᥢڞғྋܨThinkJS ඪ೮ 3 ᐿᔄࣳጱᛔਧԎ᪠ኧ҅
᪠ኧڞྋ
ᤒᬡୗ҅ᚆड़ਧԎᶋଉᅎၚጱ᪠ኧᥢڞᤒᐏୗਧԎ᪠ኧጱӞᐿොୗׁ҅ᶌ୩य़ጱྋڞ᪠ኧฎአྋڞྋ ̶ڞ
JavaScript export default [ [/^article\/(\d+)$/, "home/article/detail?id=:1"] ];
ݸෛጱ pathname ԅڦᯈᔄ֒ article/10 ᬯጱ pathname҅ᦩ܃տڞӤᶎጱྋ ᯾੪ݢզ᭗ᬦ this.get ොګᕳ݇හ id ҅ᬯࣁഴᩙጱکhome/article/detail ҅ଚӬਖ਼ഔ឴ ̶ဩ ឴ݐᧆ JavaScript export default class extends think.controller.base { detailAction(){ let id = this.get('id'); } }
̶ᕟ҅ᮎԍݢզ᭗ᬦ :1 ҅ :2 ҅ :3 ឴ݐଫጱړग़ӻৼํތ᯾ڞইຎྋ
JavaScript export default [ [/^article\/(\d+)$/, { get: "home/article/detail?id=:1", delete: "home/article/delete?id=:1", post: "home/article/save?id=:1" }] ];
᪠ኧڞᥢ
ইғ̶ӞԶۖாጱํތᯈොୗ҅֕ඪ೮܃᪠ኧฎӞᐿਁᒧԀڞᥢ
JavaScript export default [ ['group/:year/:month', "home/group/list"] ]
ጱک҅ڞইᦢᳯጱ URL ԅ http://www.example.com/group/2015/10 ҅ᮎԍտӾᧆᶱᥢ ᯾ګӻ݇හ year month ҅ᬯ2ӻ݇හݢզࣁഴ 2 ےpathname ԅ home/group/list ҅ݶտႲ ᭗ᬦ this.get ොဩ឴ݐ̶
JavaScript export default class extends think.controller.base { listAction(){ let year = this.get('year'); let month = this.get('month'); } }
ᶉா᪠ኧ
ᚆԞፘᥝ୧உग̶़ۑ҅ܔ᮷உᓌڦᯈොୗٟ҅ဩᦩ܃قᶉா᪠ኧฎӞᐿᕍਁᒧԀጱਠ JavaScript export default [ ["list", "home/article/list"] ]
ইᦢᳯጱ URL ԅ http://www.example.com/list ҅ᮎԍ๊ഘݸጱ pathname ԅ home/article/list ̶
ս۸᪠ኧᚆ
ᯈ̶܃ݻݸ᭑Ӟᬰᤈڹᯈฎ܃҅ڞᛔਧԎ᪠ኧฎӻහᕟ҅හᕟྯӞᶱฎӻٍ֛ጱ᪠ኧᥢ҅کӤᶎ૪ᕪ᧔ ইຎᬯӻ᪠ኧᤒྲय़ጱᦾ҅ݢᚆտํᚆᳯ̶᷌
ṛපጱᛔਧԎ᪠ኧොୗ҅ೲཛྷࣘᯈᗝ᪠ኧ̶ֵአᬯᐿොےԧӞᐿๅ׀ᚆᳯ᷌҅ThinkJS ํعԅԧ ୗ҅᪠ኧᯈᗝ໒ୗ᪙Ӥᶎᑖஙํಅӧݶ̶ common/config/route.js
ߺӻཛྷ̶ࣘکӾڞᘒฎᯈᗝߺԶᥢ҅ڞአᬯᐿොୗݸ҅᭗አཛྷࣘ᯾ጱ᪠ኧᯈᗝӧٚᯈᗝٍ֛ጱ᪠ኧᥢֵ ইғ
JavaScript export default { admin: { ڞཛྷࣘጱྋ admin //Ӿ /^admin/ reg: }, home: { //ἕᦊᩳ home ཛྷࣘ
} }
admin/config/route.js
̶ڞadmin ཛྷࣘᯈᗝ admin ӥጱٍ֛᪠ኧᥢ
JavaScript export default [ [/^admin\/(?!api).*$/, 'admin/index'], [/^admin\/api\/(\w+?)(?:\/([\d,]*))?$/, 'admin/:1?id=:2&resource=:1'], ];
ᦡᦢᳯጱ URL ԅ http://www.example.com/admin/api ҅ᮎԍᥴຉݸጱ pathname ԅ ᬰᤈڞտӾ admin ཛྷࣘ҅ᆐݸٚ admin ཛྷࣘӥጱ᪠ኧᥢڞᯈ common ᯾ጱᥢ܃҅ admin/api ᯈපሲ̶܃׀ᯈጱහᰁ҅܃ڞ᪠ኧᥢٺᯈ̶᭗ᬦᬯᐿොୗݸ੪ݢզय़य़܃᭑Ӟ ཛྷࣳ
ཛྷࣳՕᕨ
දັᒵ̶֢ཛྷࣳ੪ฎԅԧො֢හഝପᬰᤈጱᤰ҅ӞӻཛྷڢӾ҅ᕪଉᥝ֢හഝପ҅ইғीݎᶱፓ ࣳଫහഝପӾጱӞӻහഝᤒ̶
̶ ඪ೮ጱහഝପํғ Mysql ҅ MongoDB SQLiteڹፓ
ୌཛྷࣳڠ
ୌཛྷࣳғڠݢզࣁᶱፓፓ୯ӥ᭗ᬦե thinkjs model [name]
Bash thinkjs model user;
̶ ୌկ src/common/model/user.jsڠಗᤈਠ౮ݸ҅տ
ୌᵱᥝਧཛྷࣘݷғڠୌࣁٌ՜ጱཛྷࣘӥ҅ڠୌࣁ common ཛྷࣘӥ҅ইຎమڠӥཛྷࣳկտ٭ἕᦊఘ
Bash thinkjs model home/user
ୌཛྷࣳկ҅ਫֺ۸տݐཛྷࣳचᔄጱਫ̶ֺڠဳ ғཛྷࣳկӧฎᶳਂࣁ҅ইຎဌํᛔਧԎොဩݢզӧ
ཛྷࣳਫֺ۸ model ොဩ҅ᮎݢզፗള᭗ᬦᧆොဩਫֺ ํތᔄڹইຎ୮҅ڦཛྷࣳਫֺ۸ࣁӧݶጱࣈොֵአጱොୗํಅ૧ ۸҅ইғ
JavaScript export default class extends think.controller.base { indexAction(){ let model = this.model('user'); } }
ݢզ᭗ᬦ᧣አ think.model ොဩ឴ݐਫֺ۸҅ইғڞވ
JavaScript let getModelInstance = function(){ let model = think.model('user', think.config('db'), 'home'); } አ think.model ឴ݐཛྷࣳጱਫֺ۸҅ᵱᥝଃӤཛྷࣳጱᯈᗝ̶ֵ
᱾ୗ᧣አ
ԧஉग़᱾ୗ᧣አጱොဩҁᔄ֒ jQuery ᯾ጱ᱾ୗ᧣አ҂҅᭗ᬦ᱾ୗ᧣አොဩݢզොጱᬰᤈහഝ׀ཛྷࣳӾ ̶֢᱾ୗ᧣አฎ᭗ᬦᬬࢧ this ਫሿጱ̶
JavaScript export default class extends think.model.base { /** ᤒහഝڜ឴ݐ * */ * getList(){ let data = yield this.field('title, content').where({ id: ['>', 100] }).order('id DESC').select(); ... } }
ཛྷࣳӾඪ೮᱾ୗ᧣አጱොဩํғ
where , አԭັᧃᘏๅෛկጱਧԎ table , አԭਧԎᥝ֢ጱහഝᤒݷᑍ ݷڦහഝᤒਧԎڹalias , አԭᕳ୮ ጱහഝᩙڹdata , አԭෛीᘏๅෛහഝԏ field , አԭਧԎᥝັᧃጱਁྦྷ҅Ԟඪ೮ਁྦྷഭᴻ order , አԭᕮຎᬰᤈഭଧ ᧃᕮຎහഝັګlimit , አԭᴴ ᶭ҅ኞ౮ sql ݙտᛔۖഘԅ limitړpage , አԭັᧃ group , አԭັᧃጱ group ඪ೮ having , አԭັᧃጱ having ඪ೮ join , አԭັᧃጱ join ඪ೮ union , አԭັᧃጱ union ඪ೮ distinct , አԭັᧃጱ distinct ඪ೮ cache አԭັᧃᖨਂ
හഝପᯈᗝ
හഝପᯈᗝ
දғץහഝପἕᦊᯈᗝইӥ҅ݢզࣁ src/common/config/db.js Ӿᬰᤈ JavaScript export default { type: 'mysql', //හഝପᔄࣳ host: '127.0.0.1', //හഝପ host 3306 //හഝପᒒݗ҅ἕᦊԅ '', port: //හഝପݷ '', name: //ᨴݩ '', user: pwd: '', //ੂᎱ ᖗ҅ݢզᦡᗝԅᑮڹᖗ҅ইຎӧమᥝහഝᤒڹ//හഝᤒ 'think_', prefix: encoding: 'utf8', //හഝପᖫᎱ nums_per_page: 10, //ྯᶭดᐏጱහ ݙ sql ᦕ୯ಗᤈጱވ//ฎ true, log_sql: ௳מᦕ୯හഝପᬳളވ//ฎ true, log_connect: cache: { // හഝପັᧃᖨਂᯈᗝ on: true, type: '', timeout: 3600 }, adapter: { mysql: {}, //mysql ጱᇙਧᯈᗝ mongo: {} //mongo ጱᇙਧᯈᗝ } };
Ԟݢզࣁٌ՜ཛྷࣘӥᯈᗝ҅ᬯ᧗ᧆཛྷࣘ੪տֵአଫጱᯈᗝ̶
හഝᤒਧԎ
ᖗฎ think_ ҅ᮎԍ user ཛྷࣳଫጱහڹᦡහഝᤒӥ҅ཛྷࣳݷහഝᤒݷ᮷ฎӞӞଫጱ̶٭ἕᦊఘ ഝᤒԅ think_user ҅ user_group ཛྷࣳଫጱහഝᤒԅ think_user_group ̶
ද҅ݢզ᭗ᬦӥᶎ 2 ӻંᬰᤈғץইຎᵱᥝ
ᖗڹtablePrefix ᤒ ᖗڹތtableName ᤒݷ҅ӧ۱
ES6 ොୗ
JavaScript export default class extends think.model.base { init(...args){ super.init(...args); ᖗᦡᗝԅᑮڹ//ਖ਼හഝᤒ ''; = this.tablePrefix user2 //ਖ਼ଫጱහഝᤒݷᦡᗝԅ 'user2'; = this.tableName } } ୌᔄොୗڠாۖ
JavaScript module.exports = think.model({ ᖗᤒݷڹ//ፗള᭗ᬦંᦡᗝᤒ '', tablePrefix: tableName: 'user2', init: function(){ this.super('init', arguments); } })
දԆᲫץ
ཛྷࣳἕᦊጱԆᲫԅ id ҅ইຎහഝᤒ᯾ጱ Primary Key ᦡᗝӧฎ id҅ᮎԍᵱᥝࣁཛྷࣳӾᦡᗝԆᲫ̶
JavaScript export default class extends think.model.base { init(...args){ super.init(...args); this.pk = 'user_id'; //ਖ਼ԆᲫਁྦྷᦡᗝԅ user_id } }
දԆᲫ̶ץᬯԶ֢ᵱᥝکԆᲫ҅አکcount ҅ sum ҅ min ҅ max ᒵஉग़ັᧃ֢᮷տአ
ୗහഝପړ
ᐶ҅ᘒṛහഝପጱ֢ᚆ̶ThinkJS ᯾ݢզ᭗ᬦړय़ጱᔮᕹӾ҅ᕪଉํग़ӻහഝପአ؉ٟ දғץparser ᛔਧԎᥴຉ҅ݢզࣁկ src/common/config/db.js Ӿ JavaScript //ᯈᗝ const MYSQL_READ = { host: '10.0.10.1', } ٟᯈᗝ// const MYSQL_WRITE = { host: '10.0.10.2' } export default { host: '127.0.0.l', adapter: { mysql: { parser: function(options){ //mysql ጱᯈᗝᥴຉොဩ ݙ SQL //ളӥᥝಗᤈጱ options.sql; = sql let if(sql.indexOf('SELECT') === 0){ //SELECT ັᧃ return MYSQL_READ; } return MYSQL_WRITE; } } } }
ളӥᥝಗᤈጱ SQL ݙ҅ᬯ੪உොጱࣁ parser ᯾ᬬࢧଫጱތparser ᥴຉጱ݇හ options ᯾տ۱ හഝପᯈᗝ̶
CURD ֢
හഝےႲ
ӞහഝےႲ
හഝጱ id̶ইғفԅൊӞහഝ҅ᬬࢧےአ add ොဩݢզႲֵ
JavaScript export default class extends think.controller.base { * addAction(){ let model = this.model('user'); let insertId = yield model.add({name: 'xxx', pwd: 'yyy'}); } }
ग़හഝےႲ ग़හഝ҅ইғےአ addMany ොဩݢզႲֵ
JavaScript export default class extends think.controller.base { * addAction(){ let model = this.model('user'); let insertId = yield model.addMany([ {name: 'xxx', pwd: 'yyy'}, {name: 'xxx1', pwd: 'yyy1'} ]); } } thenAdd
ضݝᚆײහഝጱےӧᚆ᯿̶॔ᬯႲහഝପᦡᦇ҅౯ժᕪଉᵱᥝӻਁྦྷᦡԅࠔӞ҅ᤒᐏᬯӻਁྦྷ ̶֢فࣁ҅ইຎӧਂࣁᬰᤈൊਂވฎᧃӥᬯӻහഝັ݄
ԧ thenAdd ොဩᓌ۸ᬯӞ̶֢׀ཛྷࣳӾ
JavaScript export default class extends think.controller.base { * addAction(){ let model = this.model('user'); ےᦕ୯տႲىጱկ҅໑ഝᒫԫӻ݇හጱկັᧃ෫ፘےጱහഝ҅ᒫԫӻ݇හԅႲےᒫӞӻ݇හԅᥝႲ// let result = yield model.thenAdd({name: 'xxx', pwd: 'yyy'}, {name: 'xxx'}); // result returns {id: 1000, type: 'add'} or {id: 1000, type: 'exist'} } }
ๅෛහഝ update
ԅߥጱᤈහ̶ইғๅෛහഝֵአ update ොဩ҅ᬬࢧ
JavaScript export default class extends think.controlle.base { * updateAction(){ let model = this.model('user'); let affectedRows = yield model.where({name: 'thinkjs'}).update({email: '[email protected]'}); } } where կ҅զᴠྊ֢ᛘಅํහഝᤩᲙጱๅෛ̶ইຎᏟᦊฎๅෛಅํ ےӥๅෛහഝᶳႲ٭ἕᦊఘ ጱ where կᬰᤈ҅ইғ 1=1 ےහഝጱᵱ҅ݢզႲ JavaScript export default class extends think.controlle.base { * updateAction(){ let model = this.model('user'); let affectedRows = yield model.where('1=1').update({email: '[email protected]'}); } } increment
ইғ҅ᇙਧጱےݢզ᭗ᬦ increment ොဩᕳᒧݳկጱਁྦྷी
JavaScript export default class extends think.model.base { updateViewNums(id){ 1 ے//ਖ਼ᴅහ 1); id}).increment('view_nums', this.where({id: return } } decrement
ইғ҅ᇙਧጱٺݢզ᭗ᬦ decrement ොဩᕳᒧݳկጱਁྦྷ
JavaScript export default class extends think.model.base { updateViewNums(id){ 10 ٺ//ਖ਼ᰂ૰ 10); id}).decrement('coins', this.where({id: return } }
ັᧃහഝ
ݐ҅ݐ๋य़҅හഝ҅ັᧃग़හഝ҅ݐਁྦྷܔԧग़ᐿොୗັᧃහഝ҅ইғັᧃ׀ཛྷࣳӾ හᒵ̶
ັᧃܔහഝ
ԅ̶ইғහഝ҅ᬬࢧܔݢզֵአ find ොဩັᧃ JavaScript export default class extends think.controller.base { * listAction(){ let model = this.model('user'); let data = yield model.where({name: 'thinkjs'}).find(); //data returns {name: 'thinkjs', email: '[email protected]', ...} } }
ฎෙᬬࢧڣԅᑮ {} ҅ݢզ᭗ᬦ think.isEmpty ොဩইຎහഝᤒဌํଫጱහഝ҅ᮎԍᬬࢧ ވԅᑮ̶
ັᧃग़හഝ
ԅහഝ̶ইғݢզֵአ select ොဩັᧃग़හഝ҅ᬬࢧ
JavaScript export default class extends think.controller.base { * listAction(){ let model = this.model('user'); let data = yield model.limit(2).select(); //data returns [{name: 'thinkjs', email: '[email protected]'}, ...] } }
ෙᬬࢧڣԅᑮහᕟ [] ҅ݢզ᭗ᬦ think.isEmpty ොဩইຎහഝᤒӾဌํଫጱහഝ҅ᮎԍᬬࢧ ฎވԅᑮ̶
ᶭັᧃහഝړ
ᶭӥጱහړڹᧃጱහ҅ᆐݸࣁັᧃ୮ັضӥ੪ᵱᥝ٭ᶭሿԶහഝ҅ᬯᐿఘړೲکᶭᶎӾᕪଉ᭬ ԧ countSelect ොဩොᬯӞ֢҅տᛔۖᬰᤈ׀ഝ̶ັᧃਠහഝݸᬮᥝᦇᓒํग़ᶭ̶ཛྷࣳӾ හጱັᧃ̶
JavaScript export default class extends think.controller.base { * listAction(){ let model = this.model('user'); let data = yield model.page(this.get('page'), 10).countSelect(); } }
໒ୗইӥғᬬࢧ JavaScript { numsPerPage: 10, //ྯᶭดᐏጱහ ᶭڹ//୮ 1, currentPage: count: 100, //හ totalPages: 10, //ᶭහ ᤒڜᶭӥጱහഝڹ//୮ [{ data: name: 'thinkjs', email: '[email protected]' }, ...] }
ᒫӞᶭ҅ false ԅکྋץྋ̶ true ԅץᶭහ᩻ᬦԧᶭහࢱ҅ݢզ᭗ᬦփ᭓݇හᬰᤈڹইຎփ᭓ጱ୮ ̶ (ғ countSelect(true) countSelect(falseܨݸӞᶭ๋҅کྋץ
ইຎහ෫ဩፗളັᧃ҅ݢզਖ਼හ֢ԅ݇හփ᭓ᬰ݄҅ইғ countSelect(1000) ҅ᤒᐏහํ 1000̶ count
ݢզ᭗ᬦ count ොဩັᧃᒧݳկጱහ҅ইғ
JavaScript export default class extends think.model.base { getMin(){ //ັᧃ status ԅ publish ጱහ return this.where({status: 'publish'}).count(); } } sum
ݢզ᭗ᬦ sum ොဩັᧃᒧݳկጱਁྦྷ҅ইғ
JavaScript export default class extends think.model.base { getMin(){ //ັᧃ status ԅ publish ਁྦྷ view_nums ጱ return this.where({status: 'publish'}).sum('view_nums'); } } max
ইғ҅ݢզ᭗ᬦ max ොဩັᧃᒧݳկጱ๋य़ JavaScript export default class extends think.model.base { getMin(){ ጱ๋य़ comments publish҅ਁྦྷ ԅ status ᧃັ// return this.where({status: 'publish'}).max('comments'); } } min
ইғ҅ݢզ᭗ᬦ min ොဩັᧃᒧݳկጱ๋ੜ
JavaScript export default class extends think.model.base { getMin(){ ጱ๋ੜ comments publish҅ਁྦྷ ԅ status ᧃັ// return this.where({status: 'publish'}).min('comments'); } }
ັᧃᖨਂ
ԅԧᚆս۸҅ᶱፓӾᕪଉᥝӞԶහഝପӾັᧃጱහഝᬰᤈᖨਂ̶ইຎಋૡਖ਼ັᧃጱහഝᬰᤈᖨਂ҅۠ ԧ cache ොဩᦡᗝັᧃᖨਂ̶ইғ׀ྲἋᅸ҅ཛྷࣳӾፗള
JavaScript export default class extends think.model.base { getList(){ //ᦡਧᖨਂ key ᖨਂᳵ return this.cache('get_list', 3600).where({id: {'>': 100}}).select(); } }
ӤᶎጱդᎱԅັᧃᕮຎᬰᤈᖨਂ҅ইຎ૪ᕪํԧᖨਂ҅ፗളᖨਂ᯾ݐ҅ဌํጱᦾහഝପ᯾ັᧃ̶ ጱ key ԅ get_list ҅ᖨਂᳵԅӞӻੜ̶ਂכᖨਂ
Ԟݢզӧਧᖨਂ key҅ᬯտᛔۖ໑ഝ SQL ݙኞ౮Ӟӻᖨਂ key̶ইғ
JavaScript export default class extends think.model.base { getList(){ ݝᦡਧᖨਂᳵ// return this.cache(3600).where({id: {'>': 100}}).select(); } } ᖨਂᯈᗝ
ᖨਂᯈᗝԅཛྷࣳᯈᗝӾጱ cache ਁྦྷ҅ইғ
JavaScript export default { cache: { on: true, type: '', timeout: 3600 } }
ᑕଧӾ᧣አ cache ොဩԞ෫ප̶ֵܨᳮݸى҅ىon හഝପᖨਂᯈᗝጱ type ᖨਂᯈᗝᔄࣳ҅ἕᦊԅٖਂ҅ඪ೮ጱᖨਂᔄࣳ᧗ᥠ Adapter -> Cache̶ timeout ἕᦊᖨਂᳵ̶
ᴻහഝڢ
ԅߥጱᤈහ̶ইғᴻහഝ҅ᬬࢧڢݢզֵአ delete ොဩ
JavaScript export default class extends think.controller.base { * deleteAction(){ let model = this.model('user'); let affectedRows = yield model.where({id: ['>', 100]}).delete(); } }
ጱ API -> model̶ىཛྷࣳӾๅग़ጱ֢ොୗ᧗ᥠፘ
ۓԪ
̶ۓᵱᥝහഝପඪ೮Ԫڹ֢ጱඪ೮҅֕ۓԧԪ׀ཛྷࣳӾ
ጱᦾ҅ᵱᥝਖ਼හഝପጱਂؙۓইຎࣁ Mysql ӥֵአԪ҅ۓMysql Ӿጱ InnoDB BDB ਂؙකඪ೮Ԫ කᦡᗝԅ InnoDB BDB̶
̶ۓSQLite ፗളඪ೮Ԫ
ۓአԪֵ
̶ۓԧ startTrans ҅ commit rollback 3 ᐿොဩ֢Ԫ׀ཛྷࣳӾ
ۓԪސstartTrans ۓcommit ྋଉ֢ݸ҅ԻԪ rollback ֢ଉݸᬰᤈࢧ჻
ES6 ොୗ
JavaScript export default class extends think.controller.base { * indexAction(){ let model = this.model('user'); try{ yield model.startTrans(); let userId = yield model.add({name: 'xxx'}); let insertId = yield this.model('user_group').add({user_id: userId, group_id: 1000}); yield model.commit(); }catch(e){ yield model.rollback(); } } }
##### ୌᔄጱොୗڠாۖ
JavaScript module.exports = think.controller({ indexAction: function(self){ var model = this.model('user'); return model.startTrans().then(function(){ return model.add({name: 'xxx'}); }).then(function(userId){ return self.model('user_group').add({user_id: userId, group_id: 1000}) }).then(function(){ return self.commit(); }).catch(function(err){ return self.rollback(); }); } }) transaction ොဩ
҅ᥝӞፗֵአ startTrans ҅ commit rollback ᬯ 3 ӻොဩᬰᤈֵ֢҅አ᩸ํӞԶۓአԪֵ ̶ۓොጱ॒ቘԪےԧ transaction ොဩๅ׀ӧ̶ԅԧᓌ۸ᬯӞ֢҅ཛྷࣳӾ
ES6 ොୗ JavaScript export default class extends think.controller.base { * indexAction(self){ let model = this.model('user'); let insertId = yield model.transaction( function * (){ let userId = yield model.add({name: 'xxx'}); return yield self.model('user_group').add({user_id: userId, group_id: 1000}); }) } }
ဳғArrow Function ෫ဩ */yield Ӟٟ᩸҅ಅզӤᶎԅ function * ̶ইຎమֵአ Arrow Function҅ ̶ {} <= () ݢզֵአ async҅ইғ async
ୌᔄጱොୗڠአۖாֵ
JavaScript module.exports = think.controller({ indexAction: function(self){ var model = this.model('user'); return model.transaction(function(){ return model.add({name: 'xxx'}).then(function(userId){ return self.model('user_group').add({user_id: userId, group_id: 1000}); }); }).then(function(insertId){
}).catch(function(err){
}) } })
හӾ॒ቘ፥ྋጱ᭦ᬋ҅ଚᵱᥝᬬࢧ̶ڍ᧣හ҅ᬯӻࢧڍ᧣transaction ളතӞӻࢧ
ᘶཛྷࣳى
ړਮᒍտํܗᘶጱᤒӞ̶֢᩸ইғӞӻىᘶ҅හഝ֢ᵱᥝᬳݶىහഝପӾᤒᕪଉտ᪙ٌ՜හഝᤒํ ᔄ̵ຽᓋ̵ᦧᦞ҅զ݊ંԭߺӻአಁ̶
̶ܔᘶཛྷࣳ҅ᦏ॒ቘᬯᔄ֢ᶋଉᓌىThinkJS Ӿඪ೮
ඪ೮ጱᔄࣳ
ᔮ̶ইғىᘶىᘶཛྷࣳӾඪ೮ଉᥠጱ 4 ᔄى think.model.HAS_ONE ӞӞཛྷࣳ think.model.BELONG_TO ӞӞંԭ think.model.HAS_MANY Ӟग़ think.model.MANY_TO_MANY ग़ग़
ᘶཛྷࣳىୌڠ
ᘶཛྷ̶ࣳইғىୌڠݢզ᭗ᬦե thinkjs model [name] --relation
Bash thinkjs model home/post --relation
̶ ୌཛྷࣳկ src/home/model/post.jsڠտ
ᔮىᘶىਧ
ᔮ̶ইғىᘶىݢզ᭗ᬦ relation ંਧ
JavaScript export default class extends think.model.relation { init(...args){ super.init(...args); ᔮىᘶىᔮ҅ݢզਧग़ӻىᘶىંਧ relation ᭗ᬦ// this.relation = { cate: {}, comment: {} } } }
Ԟݢզፗളֵአ ES7 ᯾ጱဩፗളਧԎ relation ં̶ইғ
JavaScript export default class extends think.model.relation {
//ፗളਧԎ relation ં relation = { cate: {}, comment: {} }
init(...args){ super.init(...args); } } ᔮཛྷࣳጱහഝ໒ୗىӻܔ
JavaScript export default class extends think.model.relation { init(...args){ super.init(...args); this.relation = { cate: { type: think.model.MANY_TO_MANY, //relation type model: '', //model name name: 'profile', //data name key: 'id', fKey: 'user_id', //forign key field: 'id,name', where: 'name=xx', order: '', limit: '', rModel: '', rfKey: '' }, } } }
Ԏইӥғތݱӻਁྦྷ
ᔮᔄࣳىᘶى type ᘶᤒጱཛྷࣳݷ҅ἕᦊԅᯈᗝጱ key҅ᬯ᯾ԅ cateى model name ଫጱහഝਁྦྷݷ҅ἕᦊԅᯈᗝጱ key҅ᬯ᯾ԅ cate ᘶ keyىཛྷࣳጱڹkey ୮ ᘶᤒӨݝଫጱ keyى fKey fKey ଫጱ ތᘶᤒັᧃᦡᗝጱ field҅ইຎᵱᥝᦡᗝ҅ᶳ۱ى field ᘶᤒັᧃᦡᗝጱ where կى where ᘶᤒັᧃᦡᗝጱ orderى order ᘶᤒັᧃᦡᗝጱ limitى limit ᘶᤒັᧃᦡᗝጱ pageى page ᔮཛྷࣳݷىᘶىrModel ग़ग़ӥ҅ଫጱ ᔮᤒଫጱ keyىᔮىrfKey ग़ग़ӥ҅ଫ᯾ጱ
ጱොୗғܔݢզ᭗ᬦӥᶎᓌ҅௳מᘶᔄࣳ҅ӧአᦡᗝٌ՜ਁྦྷىইຎݝአᦡᗝ JavaScript export default class extends think.model.relation { init(...args){ super.init(...args); this.relation = { cate: think.model.MANY_TO_MANY } } }
HAS_ONE
Ӟӻᴫંᤒ̶ํތᤒڹᘶ҅ᤒᐏ୮ىӞӞ
ྦྷਁ҅ ԅ idᘶᤒጱཛྷࣳݷԅ info ҅ᮎԍᯈᗝӾਁྦྷ key ጱἕᦊى҅ ᤒጱཛྷࣳݷԅ userڹᦡ୮ ̶ ԅ user_idfKey ጱἕᦊ
JavaScript export default class extends think.model.relation { init(..args){ super.init(...args); this.relation = { info: think.model.HAS_ONE } } }
ᔄ֒ইӥጱහഝғکಗᤈັᧃ֢҅ݢզ
JavaScript [ { id: 1, name: '111', ௳מᘶᤒ᯾ጱහഝى// } :info user_id: 1, desc: 'info' } }, ...]
BELONG_TO
ᔮ̶ىጱݍᘶᤒ҅ HAS_ONE ฎፘىᘶ҅ંԭӻىӞӞ
ԅ user_id ҅ᯈᗝᘶᤒጱཛྷࣳݷԅ user ҅ᮎԍᯈᗝਁྦྷ key ጱἕᦊى҅ ཛྷࣳݷԅ infoڹᦡ୮ ̶ ԅ idfKey ጱἕᦊ ྦྷਁ JavaScript export default class extends think.model.relation { init(..args){ super.init(...args); this.relation = { user: think.model.BELONG_TO } } }
ᔄ֒ӥᶎጱහഝғکಗᤈັᧃ֢҅ݢզ
JavaScript [ { id: 1, user_id: 1, desc: 'info', user: { name: 'thinkjs' } }, ... ]
HAS_MANY
ᔮ̶ىӞग़ጱ
ԅ id ҅ᯈᗝਁྦྷᘶᤒጱཛྷࣳݷԅ comment ҅ᮎԍᯈᗝਁྦྷ key ἕᦊى҅ ཛྷࣳݷԅ postڹ୮فے ̶ ԅ post_idfKey ἕᦊ
JavaScript 'use strict'; /** * relation model */ export default class extends think.model.relation { init(...args){ super.init(...args);
this.relation = { comment: { type: think.model.HAS_MANY } } } } ᔄ֒ӥᶎጱහഝғکಗᤈັᧃහഝ҅ݢզ
JavaScript [{ id: 1, title: 'first post', content: 'content', comment: [{ id: 1, post_id: 1, name: 'welefen', content: 'first comment' }, ...] }, ...]
ᶭັᧃ҅ݢզ᭗ᬦ page ݇හᬰᤈ҅ইғړᘶᤒጱහഝᵱᥝىইຎ
JavaScript 'use strict'; /** * relation model */ export default class extends think.model.relation { init(...args){ super.init(...args);
this.relation = { comment: { type: think.model.HAS_MANY } } } getList(page){ return this.setRelation('comment', {page: page}).select(); } }
හ̶ڍහ҅ݳଚ݇හտᛔۖಗᤈᧆڍᴻԧአ setRelation ݳଚ݇හक़҅ݢզਖ਼݇හᦡᗝԅ
MANYTOMANY
ᔮ̶ىग़ग़
ᔮᤒ̶ᯈᗝਁྦྷ rModelىᘶىᘶཛྷࣳݷԅ cate ҅ᮎԍᵱᥝӞӻଫጱى҅ ཛྷࣳݷԅ postڹᦡ୮ ̶ ԅ cate_idԅ post_cate ҅ᯈᗝਁྦྷ rfKey ἕᦊἕᦊ JavaScript 'use strict'; /** * relation model */ export default class extends think.model.relation { init(...args){ super.init(...args);
this.relation = { cate: { type: think.model.MANY_TO_MANY, rModel: 'post_cate', rfKey: 'cate_id' } } } }
ጱහഝᕮԅғڊᧃັ
JavaScript [{ id: 1, title: 'first post', cate: [{ id: 1, name: 'cate1', post_id: 1 }, ...] }, ...]
ᘶྒሾى
ᘶᤒጱහഝىᘶᤒ҅Ӟӻᦡᗝොԅ HASONE҅ݚӞӻᦡᗝොԅ BELONGTO҅ᬯࣁັᧃىইຎ 2 ӻ ᘶᤒ๋҅ᕣᛘྒሾ̶ىᤒ݈ັᧃԧӞ᭭҅ଚӬտེٚັᧃڹտਖ਼୮
ሾ̶ইғྒعᚆ҅ᘒۑᘶັᧃىᘶᤒጱىᳮىྦྷਁ ݢզࣁᯈᗝ᯾ᦡᗝ relation JavaScript export default class extends think.model.relation { init(..args){ super.init(...args); this.relation = { user: { type: think.model.BELONG_TO, ᘶັᧃىᳮىັᧃ user ᘶᤒى// false relation: } } } }
ᔮ҅ইғىᘶىཛྷࣳጱڹᳮ୮ىԞݢզᦡᗝݝ
JavaScript export default class extends think.model.relation { init(..args){ super.init(...args); this.relation = { user: { type: think.model.BELONG_TO, ᔮىᘶىཛྷࣳጱ info ᳮىັᧃ user ᘶᤒى// ''info relation: } } } }
ᔮىᘶىᳮىԁ
ᘶᤒጱහഝ҅ݢզىӥӧᵱᥝັᧃ٭ᘶᤒጱහഝ̶ইຎԶఘىᔮݸ҅ັᧃᒵ֢᮷տᛔۖັᧃىᘶىᦡᗝ ᔮັᧃ̶ىᘶىᳮى᭗ᬦ setRelation ොဩԁ
ᳮى᮱ق
ᔮັᧃ̶ىᘶىᳮಅํጱى (᭗ᬦ setRelation(false JavaScript export default class extends think.model.relation { init(...args){ super.init(...args); this.relation = { comment: think.model.HAS_MANY, cate: think.model.MANY_TO_MANY } }, getList(){ return this.setRelation(false).select(); } }
አސړ᮱
ᔮහഝ̶ىᘶىᘶහഝ҅ӧັᧃٌ՜ጱى᭗ᬦ setRelation('comment') ݝັᧃ comment ጱ
JavaScript export default class extends think.model.relation { init(...args){ super.init(...args); this.relation = { comment: think.model.HAS_MANY, cate: think.model.MANY_TO_MANY } }, getList2(){ return this.setRelation('comment').select(); } }
ᳮىړ᮱
ᔮහഝັᧃ̶ىᘶىᳮ comment ጱى (᭗ᬦ setRelation('comment', false JavaScript export default class extends think.model.relation { init(...args){ super.init(...args); this.relation = { comment: think.model.HAS_MANY, cate: think.model.MANY_TO_MANY } }, getList2(){ return this.setRelation('comment', false).select(); } }
አސ᮱ق᯿ෛ
ᔮහഝັᧃ̶ىᘶىአಅํጱސ᭗ᬦ setRelation(true) ᯿ෛ
JavaScript export default class extends think.model.relation { init(...args){ super.init(...args); this.relation = { comment: think.model.HAS_MANY, cate: think.model.MANY_TO_MANY } }, getList2(){ return this.setRelation(true).select(); } }
ᘶཛྷࣳى mongo
ᘶཛྷࣳ᧗ᥠىᘶཛྷࣳጱ֢ӧᭇݳ mongo ཛྷࣳ҅mongo ጱىᧆ https://docs.mongodb.org/manual/tutorial/model-embedded-one-to-one-relationships-between- documents/̶
Mysql
ThinkJS Mysql ֢ํஉঅጱඪ೮҅ବ੶ֵአጱପԅ https://www.npmjs.com/package/mysql̶
ᬳള
දᯈᗝץᚆ̶ۑἕᦊᬳള Mysql তᕣݝํӞӻᬳള҅ইຎమᥝग़ӻᬳള҅ݢզֵአᬳളጱ sr/common/config/db.js ҅ইғ
JavaScript export default { connectionLimit: 10 //ୌᒈ 10 ӻᬳള } socketPath
ӥฎ᭗ᬦ host port ᬳള Mysql ጱ҅ইຎమ᭗ᬦ unix domain socket ᬳള Mysql҅ݢզᦡᗝ٭ἕᦊఘ ӥᶎጱᯈᗝғ
JavaScript export default { socketPath: '/tmp/mysql.socket' }
SSL options
ݢզ᭗ᬦӥᶎጱᯈᗝਧ᭗ᬦ SSL ᬳളғ
JavaScript export default { ssl: { ca: fs.readFileSync(__dirname + '/mysql-ca.crt') } }
හഝପඪ೮ emoji ᤒఘ
හഝପጱᖫᎱӞᛱտᦡᗝԅ utf8 ҅֕ utf8 ଚӧඪ೮ emoji ᤒఘ҅ইຎᵱᥝහഝପඪ೮ emoji ᤒఘ҅ᵱᥝਖ਼ හഝପᖫᎱᦡᗝԅ utf8mb4 ̶
දԅ utf8mb4 ̶ইғץݶᵱᥝਖ਼ src/common/config/db.js ᯾ጱ encoding ᯈᗝ
JavaScript export default { encoding: 'utf8mb4' }
Error: Handshake inactivity timeout
ሿӥᶎጱᲙғڊࣁԶ Node.js ᇇӥҁইғ4.2.0҂ᬳള Mysql տ Error: Handshake inactivity timeout at Handshake.sequence.on.on.on.on.on.self._connection._startTLS.err.code (/home/***/node_modules/mysql/lib/protocol/Protocol.js:154:17) at Handshake.emit (events.js:92:17) at Handshake._onTimeout (/home/***/node_modules/mysql/lib/protocol/sequences/Sequence.js:116:8) at Timer.listOnTimeout [as ontimeout] (timers.js:112:15) ------at Protocol._enqueue (/home/***/node_modules/mysql/lib/protocol/Protocol.js:135:48) at Protocol.handshake (/home/***/node_modules/mysql/lib/protocol/Protocol.js:52:41) at PoolConnection.connect (/home/***/node_modules/mysql/lib/Connection.js:119:18) at Pool.getConnection (/home/***/node_modules/mysql/lib/Pool.js:45:23) at Object.exports.register (/home/***/node_modules/hapi-plugin-mysql/lib/index.js:40:27) at /home/***/node_modules/hapi/lib/plugin.js:242:14 at iterate (/home/***/node_modules/hapi/node_modules/items/lib/index.js:35:13) at done (/home/***/node_modules/hapi/node_modules/items/lib/index.js:27:25) at Object.exports.register (/home/***/node_modules/lout/lib/index.js:95:5) at /home/***/node_modules/hapi/lib/plugin.js:242:14
ݢᥴ٬̶ܨෛᇇ๋کᕆ܋ ᥴ٬ොໜғ ਖ਼ Node.js
MongoDB
ThinkJS ඪ೮ֵአ MongoDB හഝପ҅ବ੶ֵአ mongodb ཛྷ̶ࣘ
ᯈᗝ
දᯈᗝկץ҅ አ MongoDB හഝପ҅ᵱᥝਖ਼ཛྷࣳӾጱᯈᗝ type දԅ mongoֵ src/common/config/db.js ғ
JavaScript export default { type: 'mongo' }
ग़ HOST
ᚆ҅ইғۑݢզਖ਼ᯈᗝ᯾ጱ host ਁྦྷᦡᗝԅහഝඪ೮ग़ host ጱ JavaScript export default { type: 'mongo', adapter: { mongo: { host: ['10.0.0.1', '10.0.0.2'], port: ['1234', '5678'] } } }
ဳ ғྌᯈᗝᶱࣁ 2.0.14 ᇇӾඪ೮̶
ᯈᗝᭌᶱ
ইғ҅ے᷐क़ጱ݇හ҅ݢզ᭗ᬦࣁ options ᯾᭄ےႲײጱۓইຎᥝࣁᬳള MongoDB ๐
JavaScript export default { type: 'mongo', adapter: { mongo: { options: { authSource: 'admin', replicaSet: 'xxx' } } } }
Ӥᶎጱᯈᗝݸ҅ᬳള MongoDB ጱ URL ݒ౮ᔄ֒ԭ mongodb://127.0.0.1:27017/?authSource=admin&replicaSet=xxx ̶
ๅग़᷐क़ጱᯈᗝ᧗ᥠ http://mongodb.github.io/node-mongodb-native/2.0/reference/connecting/connection- settings/̶
ୌཛྷࣳڠ
ୌཛྷࣳ҅ইғڠݢզ᭗ᬦե thinkjs model [name] --mongo
JavaScript thinkjs model user --mongo
ୌࣁٌ՜ཛྷࣘӥ҅ᵱᥝଃӤٍ֛ጱཛྷڠୌկ src/common/model/user.js ̶ইຎమڠಗᤈਠ౮ݸ҅տ ࣘݷ̶ইғ JavaScript thinkjs model home/user --mongo
̶ ୌཛྷࣳկ҅կԅ src/home/model/user.jsڠտࣁ home ཛྷࣘӥ
ཛྷࣳᖀಥ
ද̶ץᔄӧฎᖀಥᧆᔄ҅ᵱᥝಋۖڹཛྷࣳᵱᥝᖀಥ think.model.mongo ᔄ҅ইຎ୮
ES6 ဩ
JavaScript export default class extends think.model.mongo {
}
ୌᔄጱොୗڠாۖ
JavaScript module.exports = think.model('mongo', {
})
CURD ֢
CURD ֢ Mysql Ӿളݗፘݶٍ֛҅᧗ᥠ ཛྷࣳ -> Օᕨ̶
ୌᔱڠ
ୌᔱ҅ᯈᗝනࣁ indexes ં᯾̶ڠཛྷࣳտᛔ݄ۖڹදັ֢ԏڢmongo ཛྷࣳݢզᯈᗝᔱ҅ࣁी ইғ
JavaScript export default class extends think.model.mongo { init(...args){ super.init(...args); //ᯈᗝᔱ this.indexes = {
} } }
ܔਁྦྷᔱ JavaScript export default class extends think.model.mongo { init(...args){ super.init(...args); //ᯈᗝᔱ this.indexes = { name: 1 } } }
ࠔӞᔱ
᭗ᬦ $unique ਧԅࠔӞᔱ҅ইғ
JavaScript export default class extends think.model.mongo { init(...args){ super.init(...args); //ᯈᗝᔱ this.indexes = { name: {$unique: 1} } } }
ग़ਁྦྷᔱ
ݢզਖ਼ग़ӻਁྦྷᘶݳᔱ҅ইғ
JavaScript export default class extends think.model.mongo { init(...args){ super.init(...args); //ᯈᗝᔱ this.indexes = { email: 1 test: { name: 1, title: 1, $unique: 1 } } } } ឴ݐᔱ
ୌጱᔱ̶ইғڠݢզ᭗ᬦොဩ getIndexes ឴ݐ
JavaScript export default class extends think.controller.base { async indexAction(){ let model = this.model('user'); let indexes = await model.getIndexes(); } } aggregate
ݢզ᭗ᬦ aggregate ොဩᬰᤈႰݳ̶֢ইғ
JavaScript export default class extends think.model.mongo { match(){ return this.aggregate([ {$match: {status: 'A'}}, {$group: {_id: "$cust_id", total: {$sum: "$amount"}}} ]); } }
̶/᧗ᥠ https://docs.mongodb.org/manual/core/aggregation-introductionٍ֛
MapReduce
ݢզ᭗ᬦ mapReduce ොဩᬰᤈ MapReduce ̶֢ইғ JavaScript export default class extends think.model.mongo { execMapReduce(){ let map = () => { emit(this.cust_id, this.amount); } let reduce = (key, values) => { return Array.sum(values); } return this.mapReduce(map, reduce, { query: {status: "A"}, out: "order_totals" }) } }
᧗ᥠ https://docs.mongodb.org/manual/core/aggregation-introduction/#map-reduce̶ٍ֛
SQLite
ThinkJS Ӿඪ೮ֵአ SQLite හഝପ҅ବ੶ֵአ sqlite3 ཛྷ̶ࣘ
ᯈᗝ
දᯈᗝկץ҅ አ SQLite҅ᵱᥝਖ਼ཛྷࣳӾጱᯈᗝ type දԅ sqliteֵ src/common/config/db.js ғ
JavaScript export default { type: 'sqlite' }
ؙොୗਂ
̶ SQLite ඪ೮ֵአٖਂᘏկ 2 ᐿොୗਂනහഝ҅ᵱᥝᦡᗝᯈᗝ path
ොୗਂٖ
JavaScript export default { type: 'sqlite', //ֵአٖਂਂؙහഝ true, path: }
կොୗ ̶ կොୗᵱᥝᦡᗝਂؙ SQLite හഝጱፓ୯҅ἕᦊԅ src/common/runtime/sqlite
JavaScript export default { type: 'sqlite', //ᦡᗝਂؙහഝկጱፓ୯ '/path/to/store/sqlite' path: }
ӥහഝପ demo ଫጱկ᪠ஆԅ٭ଫጱහഝᤒկ᪠ஆԅ path + /[name].sqlite ҅ἕᦊఘ src/common/runtime/sqlite/demo.sqlite ̶
CURD ֢
CURD ֢ Mysql ፘݶٍ֛҅᧗ᥠ ཛྷࣳ -> Օᕨ̶
Adapter
Adapter
ᚆጱग़ᐿਫሿ҅ইғඪ೮ग़ᐿහഝପ҅ඪ೮ग़ᐿཛྷᇇකᒵ̶ᔮᕹἕᦊඪ೮ጱۑAdapter ฎአᥴ٬Ӟᔄ Adapter ํғ Cache ҅ Session ҅ WebSocket ҅ Db ҅ Store ҅ Template Socket ̶
ୌ Adapterڠ
ୌ Adapter҅ইғڠݢզ᭗ᬦե thinkjs adapter [type]/[name]
Bash thinkjs adapter template/dot
ୌጱկ᪠ஆԅڠୌӞӻݷԅ dot ጱ Template Adapter҅ڠ src/common/adapter/template/dot.js ̶կٖᔄ֒ইӥғ
JavaScript export default class extends think.adapter.template { /** * init * @return {[]} [] */ init(...args){ super.init(...args); } }
ୌӞӻ Base ᔄٌ҅՜ᔄտᖀಥᧆᔄ̶ڠӧਂࣁ҅տᛔۖڹୌጱᔄࣳԏڠইຎ Adapterے
ଫጱ Adapter҅ইғےݢզ᭗ᬦ think.adapter ොဩ
JavaScript Adapter Template ጱ dot ݷԅے// ;(''dot think.adapter('template', = Template let Adapter //ਫֺ۸ Template(...args); new = instance let
አᒫӣො Adapterֵ
ᒫف Adapter ҅ᔮᕹտᛔۖ src/common/adapter ፓ୯ᔮᕹፓ୯ັತଫጱ Adapter҅ইຎے ᧆ Adapter̶کᔮᕹ෫ဩತڞވӣොጱ Adapter҅ᵱᥝਖ਼ Adapter ဳٙᬰ݄҅
ݢզ᭗ᬦ think.adapter ොဩဳٙᒫӣොጱ Adapter҅ইғ
JavaScript let DotTemplate = require('think-template-dot'); think.adapter('template', 'dot', DotTemplate);
̶ے੪տᛔۖۖސۓਖ਼կਂනࣁ src/common/bootstrap/ ፓ୯ӥ҅ᬯ๐
Cache
ԧग़ᐿጱᖨਂොୗ҅۱ೡғٖਂᖨਂ̵կᖨ׀ࣁᶱፓӾ҅ݳቘֵአᖨਂᚆํஉय़ጱଆ̶ۗThinkJS ਂ̵Memcache ᖨਂ̵Redis ᖨਂᒵ̶
ᖨਂᔄࣳ
ᔮᕹἕᦊඪ೮ጱᖨਂᔄࣳইӥғ memory ٖਂᖨਂ file կᖨਂ memcache Memcache ᖨਂ redis Redis ᖨਂ
ᥠ ᯈᗝ̶҅௳מইຎֵአ memcache ᖨਂ҅ᵱᥝᦡᗝ Memcache ᯈᗝ
ᥠ ᯈᗝ̶҅௳מইຎֵአ redis ᖨਂ҅ᵱᥝᦡᗝ Redis ᯈᗝ
ᖨਂᯈᗝ
දғץἕᦊᖨਂᯈᗝইӥ҅ݢզࣁᯈᗝկ src/common/config/cache.js Ӿᬰᤈ JavaScript export default { type: 'file', //ᖨਂᔄࣳ ғᑁ֖ܔ//०පᳵ҅ 3600, * 6 timeout: ӥጱᯈᗝ adapter //ӧݶ { adapter: file: { path: think.getPath(undefined, think.dirname.runtime) + '/cache', //ᖨਂկጱ໑ፓ୯ path_depth: 2, //ᖨਂկኞ౮ৼፓ୯ጱႮଶ //ᖨਂկጱಘݷ '.json' file_ext: }, redis: { prefix: 'thinkjs_' }, memcache: { prefix: 'thinkjs_' } } };
ԧ adapter ᯈᗝ̶ےဳ ғ 2.0.6 ᇇতႲ
Ӿ prefix ࣁ memcache redis ᔄࣳӾֵአ҅ਂؙտਖ਼ᖨਂ key + prefix ֢ԅෛጱ key ਂٌ ٫ᑱ̶ইຎӧమᦡᗝ prefix҅ݢզਖ਼ prefix ᦡᗝԅᑮਁᒧԀ҅ইғ ؙ҅አԭᴠྊ᪙ٌ՜ࣈොֵአጱᖨਂ key
JavaScript export default { ᖗᦡᗝԅᑮڹ key //ਖ਼ᖨਂ '' prefix: }
አᖨਂֵ
දັٍ֢֛҅᧗ᥠ API -> think̶ڢݢզ᭗ᬦ think.cache ොဩᖨਂᬰᤈी
አ࣋วࣁᖀಥᛔ think.http.base ጱᔄӥ҅ݢզ᭗ᬦ this.cache ොဩ֢ᖨਂٍ֛҅᧗ᥠֵڹইຎ୮ API -> think.http.base̶
ಘᖨਂ
ୌӞӻݷԅ foo ᖨਂᔄғڠݢզ᭗ᬦӥᶎጱե
Bash thinkjs adapter cache/foo
ୌկ src/common/adapter/cache/foo.js ̶ಘᖨਂᔄᵱᥝਫሿইӥጱොဩғڠಗᤈਠ౮ݸ҅տ JavaScript export default class extends think.cache.base { /** ত۸ොဩڡ * * @param {Object} options [] * @return {} [] */ init(options){ //set gc type & start gc this.gcType = 'cache_foo'; think.gc(this); } /** ឴ݐᖨਂ * * @param {String} name [] * @return {Promise} [] */ get(name){
} /** * ᦡᗝᖨਂ * @param {String} name [] * @param {Mixed} value [] * @param {Number} timeout [] * @return {Promise} */ set(name, value, timeout){
} /** ᴻᖨਂڢ * * @param {String} name [] * @return {Promise} [] */ delete(name){
} /** * ᖨਂ࣯࣍ࢧත * @return {Promise} [] */ gc(){
} }
ຝ᯾ጱ Cache ਫሿ᧗ᥠ https://github.com/75team/thinkjs/tree/master/src/adapter/cache̶ አᒫӣොᖨਂ Adapterֵ
ইֵ֜አᒫӣොጱᖨਂ Adapter ᧗݇ᥠ Adapter -> Օᕨ̶
Session
ᵱᥝአಁጭ୯ጱᗑᒊचӤ᮷ᐶӧ Session҅ThinkJS ᯾ἕᦊඪ೮ग़ᐿᔄࣳጱ Session҅ ইғ file ҅ db ҅ redis ᒵ̶
ඪ೮ጱ Session ᔄࣳ memory ٖਂොୗ file կᔄࣳ db හഝପᔄࣳ redis Redis ᔄࣳ db Session
ୌ҂҅ݢզአӥᶎጱ SQL ڠ෫ᵱڞ ୌଫጱහഝᤒҁইຎฎ MongoDBڠአ db ᔄࣳጱ Session ᵱᥝֵ ୌғڠݙ
SQL DROP TABLE IF EXISTS `think_session`; CREATE TABLE `think_session` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `cookie` varchar(255) NOT NULL DEFAULT '', `data` text, `expire` bigint(11) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `cookie` (`cookie`), KEY `expire` (`expire`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ᖗ̶ڹᵱᥝਖ਼ think_ දԅ db ᯈᗝӾጱහഝᤒ redis Session
አ redis ᔄࣳጱ Session ᵱᥝᯈᗝ Redisٍ֛҅ᥠ ᯈᗝ̶ֵ
Session ᯈᗝ
දғץSession ἕᦊᯈᗝইӥ҅ݢզࣁ src/common/config/session.js Ӿᬰᤈ JavaScript export default { type: 'file', ጱݷᑍ cookie //ଫ 'thinkjs', name: ੂےᵱᥝވฎ cookie ଫጱ //Session '', secret: timeout: 24 * 3600, //ᬦ๗ᳵ҅ἕᦊԅӞॠ cookie: { // cookie options length: 32 }, adapter: { file: { path: think.getPath('common', 'runtime') + '/session' } } };
ԧ adapter ᯈᗝ̶ےဳ ғ 2.0.6 ᇇতႲ
ԭ Cookie ጱᯈᗝ᧗ᥠ ᯈᗝ̶ى
Session ٟ
Controller Logic ᯾ݢզ᭗ᬦӥᶎጱොୗٟ Sessionғ
ݐ Session
JavaScript export default class extends think.controller.base { * indexAction(){ ឴ݐsession// let value = yield this.session('userInfo'); } }
ᦡᗝ Session
JavaScript export default class extends think.controller.base { * indexAction(){ //ᦡᗝ session yield this.session('userInfo', data); } }
Ⴔᴻ Session JavaScript export default class extends think.controller.base { * indexAction(){ session አಁጱڹႴᴻ୮// yield this.session(); } }
http Ӥݢզ᭗ᬦ http.session ොဩٟ Sessionٍ֛҅᧗ᥠ API -> http̶
ಘ Session
ୌ Session Adapterғڠݢզ᭗ᬦӥᶎጱե
JavaScript thinkjs adapter session/foo
ୌկ src/common/adapter/session/foo.js ҅ᵱᥝਫሿӥᶎጱොဩғڠտ
JavaScript export default class extends think.adapter.session { /** * init * @param {Object} options [] * @return {} [] */ init(options){
} /** Session ឴ݐ * * @param {String} name [] * @return {Promise} [] */ get(name){
} /** * ᦡᗝ Session * @param {String} name [] * @param {Mixed} value [] */ set(name, value){
} /** Session ᴻڢ * * @param {String} name [] * @return {Promise} [] */ delete(name){
} /** * ๅෛ Session * @return {Promise} [] */ flush(){
} /** * Ⴔᴻᬦ๗ጱ Session * @return {Promise} [] */ gc(){
} }
ຝ᯾ጱ Session ਫሿ᧗ᥠ https://github.com/75team/thinkjs/tree/master/src/adapter/session̶
አᒫӣො Session Adapterֵ
ইֵ֜አᒫӣොጱᖨਂ Adapter ᧗݇ᥠ Adapter -> Օᕨ̶
WebSocket
ᚆ҅ThinkJS ඪ೮ग़ᐿ WebSocket ପ҅ۑᶱፓ᯾ᕪଉᥝᥝֵአ WebSocket ਫሿᘱॠᒵ ጱ۱ᤰ҅ᦏֵአጱളݗӞᛘ̶ܔইғ socket.io ҅ sockjs ᒵ҅ଚᬯԶପᬰᤈԧӞԶᓌ
ސ WebSocket
දᯈᗝկץݢզ҅ސᳮጱ҅ᶱፓইຎᵱᥝىᚆἕᦊฎۑ WebSocket src/common/config/websocket.js ғ JavaScript export default { on: false, //ฎވސ WebSocket socket.io ପᔄࣳ҅ἕᦊԅ WebSocket //ֵአጱ 'socket.io', type: origin ᦜጱر// ,'' :allow_origin ӥֵአ adapter҅socket.io ਂؙጱ socket // undefined, adapter: path: '', //url path for websocket messages: { // open: 'home/websocket/open', } };
̶ۓNode.js ๐ ސදԅ true҅ଚ᯿ץᵱᥝਖ਼ᯈᗝ on ጱ
Action ጱฉ کԪկ
ᒒਮಁᒒԏᳵ᭗ᬦԪկԻ҅ᬯۓ๐҅ګThinkJS ᯾ WebSocket ጱ۱ᤰ᭽ԧ socket.io ጱ ଫጱ Action҅ᚆߥଫٍ֛ጱԪկ̶ᯈᗝࣁ messages ਁྦྷٍ֛҅ইӥғکᒒᵱᥝਖ਼Ԫկݷฉۓ๐
JavaScript export default { messages: { open: 'home/socketio/open', // WebSocket ୌᒈᬳള॒ቘጱ Action Action ᳮ॒ቘጱى WebSocket // 'home/socketio/close', close: adduser: 'home/socketio/adduser', //adduser Ԫկ॒ቘጱ Action } }
Ӿ open close Ԫկݷࢴਧ҅ᤒᐏୌᒈᬳളෙᬳളጱԪկٌ҅՜Ԫկ࣐ԅᛔਧԎ҅ᶱፓ᯾ݢզٌ ̶ے໑ഝᵱᥝႲ
Action ॒ቘ
Action ጱฉݸ҅੪ݢզࣁଫጱ Action ֢ፘଫጱ॒ቘ̶ইғ ک᭗ᬦӤᶎᯈᗝԪկ JavaScript export default class extends think.controller.base { /** * WebSocket ୌᒈᬳള॒ቘ * @param {} self [] * @return {} [] */ openAction(self){ var socket = self.http.socket; this.broadcast('new message', { username: socket.username, message: self.http.data }); } } emit
ᭆԪկ҅ইғݎ socket ڹAction ᯾ݢզ᭗ᬦ this.emit ොဩᕳ୮
JavaScript export default class extends think.controller.base { /** * WebSocket ୌᒈᬳള॒ቘ * @param {} self [] * @return {} [] */ openAction(self){ var socket = self.http.socket; this.emit('new message', 'connected'); } } broadcast
Action ᯾ݢզ᭗ᬦ this.broadcast ොဩᕳಅํጱ socket ଠඎԪկ҅ইғ
JavaScript export default class extends think.controller.base { chatAction(self){ var socket = self.http.socket; sockets ԏक़ጱಅํ socket ڹଠඎᕳᴻ୮// this.broadcast('new message', {msg: 'message', username: 'xxx'}); } }
ጱ socket҅ݢզڹ୮ތᭆԪկ҅ইຎమ۱ݎ socket ጱಅํ sockets ڹဳ ғbroadcast ොဩἕᦊฎ妔ᴻ݄୮ ̶ ԅ trueᦡᗝᒫӣӻ݇හ
JavaScript export default class extends think.controller.base { chatAction(self){ var socket = self.http.socket; socket ጱڹ୮ތsockets҅۱ ଠඎᕳಅํጱ// this.broadcast('new message', {msg: 'message', username: 'xxx'}, true); } } socket
ጱ socket ̶ڹ୮کAction ᯾ݢզ᭗ᬦ this.http.socket ೭
Ԫկහഝ
ᭆᬦԪկጱහഝ̶ݎکAction ᯾ݢզ᭗ᬦ this.http.data ೭ socket.io
ݸᒒ᮷ํᤰֵ҅አ᩸ᶋଉො̶ڹ socket.io WebSocket io
ࣁ Action ᯾ݢզ᭗ᬦ this.http.io ឴ݐ io ҅ᧆԅ socket.io ጱӞӻਫ̶ֺ
̶()ጱොဩ᧗ᥠ http://socket.io/docs/server-api/#serverތio ۱
ᦡᗝ path
දӥᶎጱᯈᗝғץද҅ݢզץᦡᗝᤩ socket.io ॒ቘጱ᪠ஆ҅ἕᦊԅ /socket.io ̶ইຎᵱᥝ
JavaScript export default { path: '/other_path' }
ද̶ץදԧ॒ቘጱ᪠ஆݸ҅ਮಁᒒԞᥝ֢ଫጱץᒒۓဳ ғ๐
ᦡᗝ adapter
ᬯݢզᦡᗝ adapter ਫሿ̶҅מአग़ᜓᅩ᮱ᗟ WebSocket ҅ग़ᜓᅩԏᳵݢզۗ Redis ᬰᤈ᭗ֵ JavaScript import redis from 'socket.io-redis';
export default { adapter: function(){ return redis({ host: 'localhost', port: 6379 }); } }
̶/᧗ᥠ http://socket.io/docs/using-multiple-nodesٍ֛ socket.io client
̶/socket.io client҅ӥࣈ࣎ԅғhttp://socket.io/download فၨᥦᒒᵱᥝ
JavaScript var socket = io('http://localhost:8360'); //ݎᭆԪկ socket.emit('name', 'data'); //ፊލԪկ socket.on('name', function(data){
})
Ӟӻ CDN ࣈ࣎ғhttp://s4.qhimg.com/static/535dde855bc726e2/socket.io-1.2.0.js̶فԞݢզፗള
໊ḵአಁጭ୯
ጭ୯̶ইғވcookie҅ಅզݢզࣁ open ଫጱ Action ᯾໊ḵአಁฎ کWebSocket ୌᒈᬳളݢզ೭
JavaScript export default class extends think.controller.base { * openAction(){ let userInfo = yield this.session('userInfo'); if(think.isEmpty(userInfo)){
} } }
ᘱॠդᎱᐏֺ
ᘱॠᐏֺդᎱ᧗ᥠғhttps://github.com/75team/thinkjs2-demos/tree/master/websocket-socket.io̶
SockJS ᯈᗝ
දԅ sockjs ҅ইғץ አ SockJS ପ҅ᵱᥝਖ਼ᯈᗝ᯾ጱ typeֵ
JavaScript export default { type: 'sockjs' } sockjs sockjs ҅ᧆԅ SockJS ᔄጱӞӻਫ̶ֺ کAction ᯾ݢզ᭗ᬦ this.http.sockjs ೭
ᦡᗝ path
දғץᦡᗝᤩ SockJS ॒ቘጱ᪠ஆ҅ἕᦊԅ /sockjs ҅ݢզ᭗ᬦӥᶎጱᯈᗝ
JavaScript export default { path: '/websocket' }
SockJS client
SockJS client҅ӥࣈ࣎ԅғhttps://github.com/sockjs/sockjs-client̶ فၨᥦᒒᵱᥝ
ᒒۓSockJS client ଚဌํ؉Ջԍᤰ҅ಅզᵱᥝ᷐क़؉Ӟ੶۱ᤰ҅ݒ౮Ԫկጱොୗ҅զ᪙۱ᤰݸጱ๐ ଫ̶۱ᤰොୗ݇ᘍইӥғ JavaScript SockJS.prototype.emit = function(event, data){ this.send(JSON.stringify({event: event, data: data})); } SockJS.prototype.events = {}; SockJS.prototype.on = function(event, callback){ if(!(event in this.events)){ this.events[event] = []; } this.events[event].push(callback); } SockJS.prototype.onmessage = function(e) { var data = JSON.parse(e.data); var callbacks = this.events[data.event] || []; callbacks.forEach(function(callback){ callback && callback(data.data); }) }; SockJS.prototype.onopen = function() { this.onmessage(JSON.stringify({data: {event: 'open'}})); }; SockJS.prototype.onclose = function() { this.onmessage(JSON.stringify({data: {event: 'close'}})); };
ᭆၾ௳ԧ҅ইғݎ᭗ᬦӤᶎጱ۱ᤰݸ੪ݢզ᭗ᬦԪկጱොୗളත
JavaScript /sockjs ԅڞ//ᬯ᯾ጱ᪠ஆᶳᯈᗝ᯾ፘݶ҅ইຎဌํᯈᗝ SockJS('/sockjs'); new = socket var //ፊލԪկ socket.on('add user', function(data){
}); //ݎᭆԪկ socket.emit('new message', 'xxx');
໊ḵአಁጭ୯
ضጭ୯̶ݢզވጱ cookie҅ಅզ෫ဩ᭗ᬦ cookie ໊ḵአಁฎىፘ׀ࣁୌᒈᬳളӧ҅قSockJS ԅԧਞ ૪ᕪጭ୯̶ٍ֛᧗ވᭆአ໊ḵฎݎ Ӟӻ token҅ୌᒈᬳളਖ਼ᧆ tokenڊࣁᶭᶎ᯾ᬌ ᥠғhttps://github.com/sockjs/sockjs-node#authorisation̶
ᘱॠդᎱᐏֺ
ᘱॠᐏֺդᎱ᧗ᥠғhttps://github.com/75team/thinkjs2-demos/tree/master/websocket-sockjs̶ ݻդቘݍ nginx
ݻդቘ WebSocket ᧗҅ইຎࣁᶱፓӾֵአ҅ᵱᥝࣁ nginx ᯈᗝկӾݍnginx 1.3.13 ᇇতඪ೮ ইӥጱᯈᗝғےႲ
nginx proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
ԧӤᶎ 2 ӻތୌ nginx ᯈᗝկ҅ଚӬᯈᗝկ૪ᕪ۱ڠୌᶱፓ҅տᛔۖڠဳ ғ ֵአ thinkjs ե ᯈᗝ҅ݢզፗളֵአ̶ nginx դቘ WebSocket ᧗ጱ᧗ᥠ http://nginx.org/en/docs/http/websocket.html̶
Template
Template Adapter አਫሿඪ೮ग़ᐿᔄࣳጱཛྷᇇක҅ইғ ejs ҅ swig ᒵ̶
ඪ೮ཛྷᇇකᔄࣳ
base ejs ejs ཛྷᇇක jade jade ཛྷක swig Ӟᐿඪ೮ཛྷᇇᖀಥጱཛྷᇇක ᚆᶋଉ୩य़ۑnunjucks Ӟᐿᔄ֒ jinja2 ጱཛྷᇇක҅
ཛྷᇇකᯈᗝ
දғץཛྷᇇකᯈᗝইӥ҅ݢզࣁ src/common/config/view.js Ӿ
JavaScript export default { type: 'ejs', //ٍ֛ཛྷᇇක᷐क़ጱᯈᗝ { options:
} };
አཛྷᇇකֵ
ӧᵱᥝಋૡ᧣አֵአ̶ইຎࣁํԶ࣋วᶋᥝֵአጱᦾ҅ݢզ᭗ᬦӥ٭ཛྷᇇකտࣁᥤࢶ᯾ᛔۖ᧣አ҅ἕᦊఘ ଫጱཛྷᇇකғےᶎጱොୗ JavaScript let EjsTemplate = think.adapter('template', 'ejs'); let instance = new EjsTemplate(...args);
ಘཛྷᇇකᔄࣳ
ୌӞӻݷԅ foo Template ᔄғڠݢզ᭗ᬦӥᶎጱե
JavaScript thinkjs adapter template/foo
ୌկ src/common/adapter/template/foo.js ̶ಘᖨਂᔄᵱᥝਫሿইӥጱොဩғڠಗᤈਠ౮ݸ҅տ
JavaScript export default class extends think.adapter.base { /** * get compiled content * @params {String} templateFile ཛྷᇇկፓ୯ ཛྷᇇݒᰁ tVar {Object} params@ * * @params {Object} config ཛྷᇇකᯈᗝ * @return {Promise} [] */ run(templateFile, tVar, config){
} }
ຝ᯾ጱ Template ਫሿ᧗ᥠ https://github.com/75team/thinkjs/tree/master/src/adapter/template̶
አᒫӣොᖨਂ Adapterֵ
ইֵ֜አᒫӣොጱᖨਂ Adapter ᧗݇ᥠ Adapter -> Օᕨ̶
ᚆۑಘ thinkjs ե
ᧇᕡՕکੴཛྷୗਞᤰ thinkjs ཛྷࣘݸ҅ᔮᕹӥ੪տํ thinkjs ե҅ࣁᕣᒒಗᤈ thinkjs -h ݢզ፡قզ ᕨ̶ Usage: thinkjs [command]
Commands:
new
Options:
-h, --help output usage information -V, --version output the version number -e, --es6 use es6 for project, used in `new` command -r, --rest create rest controller, used in `controller` command -M, --mongo create mongo model, used in `model` command -R, --relation create relation model, used in `model` command -m, --mode
ୌᶱፓڠ
ୌᶱፓݢզ᭗ᬦ thinkjs new
Bash thinkjs new thinkjs_demo;
ES6 ොୗ
Ӥ --es6 ݇හ҅ᬯኞ౮կጱ᯾դᎱ᮷ฎ ES6 ဩጱ̶ইғےୌ ES6 ཛྷୗጱᶱፓ҅ᵱᥝڠইຎమ
Bash thinkjs new thinkjs_demo --es6
ᦡᗝᶱፓཛྷୗ
ୌᶱፓਧڠጱᦾ҅ݢզړښጱ̶ইຎᶱፓྲੜ҅ӧమೲཛྷࣘړښୌጱᶱፓฎೲཛྷࣘڠἕᦊ --mode ݇හ̶ইғ
Bash thinkjs new thinkjs_demo --mode=mini ᤒইӥғڜඪ೮ጱཛྷୗ
mini ܔཛྷࣘᶱፓ҅አԭஉᓌܔጱᶱፓ̶ ̶ړښᚆӥۑnormal ฦ᭗ᶱፓ҅ཛྷࣘࣁ ጱᶱፓ̶ړښय़ࣳᶱፓᘏమӸ໒ೲཛྷࣘ҅ړښmodule ೲཛྷࣘ
ᶱፓጱӞԶᯈڹୌӞӻݷԅ .thinkjsrc ጱᵌᡐկ҅᯾ᶎຽᦩԧ୮ڠୌᶱፓݸ҅տࣁᶱፓӥڠဳ ғ ᇇପӾ̶کفୌկ҅ಅզᵱᥝਖ਼ᧆկᵱᥝᕑڠᗝ҅ᧆᯈᗝտߥݸᖅ
ཛྷࣘےႲ
ୌٌ՜ጱཛྷࣘ҅ݢզࣁᶱፓፓ୯ӥ᭗ᬦڠୌཛྷࣘ common home ҅ইຎᬮᵱᥝڠୌᶱፓտᛔۖڠ ୌ̶ইғڠthinkjs module [name] ե
Bash thinkjs module admin
ୌଫጱկ̶ڠୌፓ୯ src/admin ҅զ݊ࣁᧆፓ୯ӥڠಗᤈਠ౮ݸ҅տ middleware ےႲ middleware̶ইғ ےݢզࣁᶱፓፓ୯ӥ᭗ᬦ thinkjs middleware [name] եႲ
Bash thinkjs middleware test;
ୌ src/common/middleware/test.js կ̶ڠಗᤈਠ౮ݸ҅տ model ےႲ model̶ইғ ےݢզࣁᶱፓፓ୯ӥ᭗ᬦ thinkjs model [name] եႲ
Bash thinkjs model user;
ୌ src/common/model/user.js կ̶ڠಗᤈਠ౮ݸ҅տ
ୌ̶ইғڠୌ҅ݢզ᭗ᬦਧཛྷࣘڠୌ҅ইຎమࣁٌ՜ཛྷࣘӥڠἕᦊտࣁ common ཛྷࣘӥ
Bash thinkjs model home/user;
ୌ src/home/model/user.js կ̶ڠਧཛྷࣘԅ home ݸ҅տ
Mongo Model ےႲ ୌ Mongo Model҅ݢզ᭗ᬦਧ --mongo ݇හႲڠᔮහഝପጱཛྷࣳ҅ইຎమىጱ Model ฎےἕᦊႲ ইғ̶ے
Bash thinkjs model home/user --mongo
Relation Model ےႲ
ᘶཛྷࣳݢզ᭗ᬦਧ --relation ݇හ̶ইғىےႲ
Bash thinkjs model home/user --relation controller ےႲ controller̶ইғ ےݢզࣁᶱፓፓ୯ӥ᭗ᬦ thinkjs controller [name] եႲ
Bash thinkjs controller user;
ୌڠୌ src/common/controller/user.js կ҅ݶտڠಗᤈਠ౮ݸ҅տ src/common/logic/user.js կ̶
ୌ̶ইғڠୌ҅ݢզ᭗ᬦਧཛྷࣘڠୌ҅ইຎమࣁٌ՜ཛྷࣘӥڠἕᦊտࣁ common ཛྷࣘӥ
Bash thinkjs controller home/user;
ୌ src/home/controller/user.js կ̶ڠਧཛྷࣘԅ home ݸ҅տ
Rest Controller ےႲ
ୌ̶ইғڠRest API҅ݢզଃӤ --rest ݇හ ׀ইຎమ
Bash thinkjs controller home/user --rest; service ےႲ service̶ইғ ےݢզࣁᶱፓፓ୯ӥ᭗ᬦ thinkjs service [name] եႲ
Bash service ളݗጱ github ୌ᧣አڠ# ;github service thinkjs
ୌ src/common/service/github.js կ̶ڠಗᤈਠ౮ݸ҅տ ୌ̶ইғڠୌ҅ݢզ᭗ᬦਧཛྷࣘڠୌ҅ইຎమࣁٌ՜ཛྷࣘӥڠἕᦊտࣁ common ཛྷࣘӥ
Bash thinkjs service home/github;
ୌ src/home/service/github.js կ̶ڠਧཛྷࣘԅ home ݸ҅տ adapter ےႲ
ୌ adapter̶ইғڠݢզ᭗ᬦ thinkjs adapter [type]/[name]
Bash thinkjs adapter template/dot
ୌӞӻݷԅ dot ጱཛྷᇇᔄࣳڠୌկ src/common/adapter/template/dot.js ҅ᤒᐏڠಗᤈݸտ adapter̶
ୌ pluginڠ
ত۸ӞڡThinkJS ඪ೮ middleware adapter 2 ᐿൊկ҅ݢզ᭗ᬦ thinkjs plugin
Bash thinkjs plugin think-template-dot npm ՙପݸ҅ොٌ՜አಁᔱ̶ کݎൊկݷᑍୌᦓֵአ think- १҅ᬯ
ᶉாᩒრᦢᳯ
ᶱፓݎ҅Ӟᛱ᮷ᵱᥝࣁཛྷᇇ᯾አᶉாᩒრ̶
ୌ www/static ፓ୯҅ᧆፓ୯ӥӫᳪአਂන JS̵CSS̵ࢶڠୌᶱፓ҅տᛔۖڠአ thinkjs եֵ ᇆᒵᶉாᩒრ̶
ᦢᳯᶉாᩒრ
ᶉாᩒრ̶فᶉாᩒრනࣁ www/static ፓ୯ݸ҅ཛྷᇇ᯾੪ݢզ᭗ᬦӥᶎጱොୗ
ཛྷᇇ᯾አ JS կ
Markup
ཛྷᇇ᯾አ CSS կ Markup
ཛྷᇇ᯾አࢶᇆկ
Markup
ᶉாᩒრᦢᳯᯈᗝ
ෙጱ̶ἕᦊᯈᗝইӥғڣڞฎᶉாᩒრ᧗҅ฎ᭗ᬦྋވԭӞӻ᧗ฎ
JavaScript export default { ᚆۑᶉாᩒრᥴຉސވ//ฎ true, resource_on: ڞෙԅᶉாᩒრ᧗ጱྋڣ// ,/($+/^(static\/|[^\/]+\.(?!js|html)\w resource_reg: }
ද̶ץᶱፓ᯾ݢզ໑ഝᵱᥝࣁᯈᗝկ᯾ src/common/config/config.js ᬰᤈ
ᳮᶉாᩒრᦢᳯىᕚӤ
੪ݢզਖ਼ᶉாᩒრጱ᧗ፗളᦏ nginxײ؉Ӟ੶դቘ҅ᬯۓᶱፓӤᕚݸ҅Ӟᛱտֵአ nginx ᒵ WEB ๐ ᳮᶉாᩒრ᧗ጱ॒ቘṛᚆ̶ى॒ቘ҅ᶱፓ᯾੪ݢզ
ᳮ҅ইғىදᯈᗝץݢզࣁᯈᗝկ src/common/config/env/prodution.js ᯾
JavaScript export default { resource_on: false }
Middleware
ᶉாᩒრᦢᳯ҅᪠ኧᥴຉ҅ᶭᶎᶉா۸ވෙฎڣ୮॒ቘአಁጱ᧗҅ᵱᥝᕪᬦஉग़॒ቘ҅ইғᥴຉ݇හ҅ ވෙ IP ฎڣ՜ጱӞԶ॒ቘ҅ইғٌےෙ҅ಗᤈ֢҅ັತཛྷᇇ҅ວཛྷᇇᒵ̶ᶱፓ᯾໑ഝᵱᥝݢᚆᬮտीڣ Ӿ҅CSRF ༄ၥᒵ̶ܔࣁἓݷ
ThinkJS ᯾᭗ᬦ middleware ॒ቘᬯԶ᭦ᬋ҅ྯӻ᭦ᬋ᮷ฎӞӻᇿᒈጱ middleware̶ࣁ᧗॒ቘӾईஉग़ ጱ middleware๋҅ᕣਠ౮Ӟӻ᧗ጱ᭦ᬋ॒ቘ̶ڜhook҅ྯӻ hook ԀᤈಗᤈӞᔮ
ᤒڜ hook
ᤒইӥғڜ ጱ hookތຝ᯾۱ request_begin ᧗ত payload_parse ᥴຉԻӤጱහഝ payload_validate ḵᦤԻጱහഝ resource ᶉாᩒრ᧗॒ቘ route_parse ᪠ኧᥴຉ ڹlogic_before logic ॒ቘԏ logic_after logic ॒ቘԏݸ ڹcontroller_before controller ॒ቘԏ controller_after controller ॒ቘԏݸ ڹview_before ᥤࢶ॒ቘԏ view_template ᥤࢶկ॒ቘ view_parse ᥤࢶᥴຉ view_filter ᥤࢶٖᬦᄁ view_after ᥤࢶ॒ቘԏݸ response_end ᧗ߥଫᕮ
ጱ middleware ইӥғތӻ hook ᯾᧣አग़ӻ middleware ਠ౮॒ቘٍ֛҅۱ྯ
JavaScript export default { request_begin: [], payload_parse: ['parse_form_payload', 'parse_single_file_payload', 'parse_json_payload', 'parse_querystring_payload' payload_validate: ['validate_payload'], resource: ['check_resource', 'output_resource'], route_parse: ['rewrite_pathname', 'subdomain_deploy', 'parse_route'], logic_before: ['check_csrf'], logic_after: [], controller_before: [], controller_after: [], view_before: [], view_template: ['locate_template'], view_parse: ['parse_template'], view_filter: [], view_after: [], response_end: [] };
ᯈᗝ hook
ද hook ଫᥝಗᤈጱ middlewareץhook ἕᦊಗᤈጱ middleware ஃஃӧᚆჿ᪃ᶱፓጱᵱ҅ݢզ᭗ᬦᯈᗝ ਠ౮҅hook ጱᯈᗝկԅ src/common/config/hook.js ̶ JavaScript export default { payload_parse: ['parse_xml'], //ᥴຉ xml }
ጱᦾ҅ݢզ᭗ᬦӥᶎጱොୗғےইຎࣁܻํᯈᗝӤी̶Ӥᶎጱᯈᗝտᥟፍധἕᦊጱᯈᗝ
ےᶎ᭄ڹࣁ
JavaScript export default { xml ᥴຉےᶎ᭄ڹ//ࣁ 'parse_xml'], ['prepend', payload_parse: }
ےࣁݸᶎ᭄
JavaScript export default { xml ᥴຉے//ࣁݸᶎ᭄ 'parse_xml'], ['append', payload_parse: }
ද̶ץጱොୗᯈᗝ middleware҅ᔮᕹጱ middleware ݷᑍݢᚆࣁݸᖅጱᇇӾํಅےဳ ғୌᦓֵአ᭄
ಗᤈ hook
ݢզ᭗ᬦ think.hook ොဩಗᤈӞӻଫጱ hook҅ইғ
JavaScript await think.hook('payload_parse', http, data); //ᬬࢧጱฎӞӻ Promise http ጱᔄӾݢզፗളֵአ this.hook ಗᤈ hook҅ইғ ํތࣁ
JavaScript await this.hook('payload_parse', data);
ୌ middlewareڠ
ғclass ොୗ function ොୗ̶ݢզ໑ഝ middleware ॔ଶ٬ਧܨThinkJS ඪ೮ 2 ᐿොୗጱ middleware҅ አߺᐿොୗ̶ֵ class ොୗ
ୌڠইຎ middleware ᵱᥝಗᤈጱ᭦ᬋྲ॔҅ᵱᥝਧԎԅ class ጱොୗ̶ݢզ᭗ᬦ thinkjs ե middleware҅ࣁᶱፓፓ୯ӥಗᤈইӥጱեғ Bash thinkjs middleware xxx
̶ ଫጱկ src/common/middleware/xxx.jsکಗᤈਠ౮ݸ҅տ፡
ES6 ොୗ #####
JavaScript 'use strict'; /** * middleware */ export default class extends think.middleware.base { /** * run * @return {} [] */ run(){
} }
ୌᔄጱොୗڠாۖ
JavaScript 'use strict';
/** * middleware */ module.exports = think.middleware({ /** * run * @return {} [] */ run: function(){
} }) middleware ᯾տਖ਼ http փ᭓ᬰ݄҅ݢզ᭗ᬦ this.http ં឴ݐ̶᭦ᬋդᎱනࣁ run ොဩಗ ̶ ྍ֢҅ᵱᥝᬬࢧӞӻ Promise ᘏֵአ */yieldํތᤈ҅ইຎ function ොୗ
ୌ౮Ӟӻڠහጱ୵ୗ̶ᬯᐿ middleware ӧୌᦓڍୌԅڠݢզፗള҅ܔইຎ middleware ᥝ॒ቘጱ᭦ᬋྲᓌ ᇿᒈጱկ҅ᘒฎනࣁӞ᩸ᕹӞ॒ቘ̶ ̶ݢզࣁᬯےտᛔۖᤩۖސۓݢզୌᒈկ src/common/bootstrap/middleware.js ҅ᧆկࣁ๐ හୗጱ middleware̶ইғڍग़ӻےӻկႲ
JavaScript think.middleware('parse_xml', http => { if (!http.payload) { return; } ... });
ྍ֢҅ᵱᥝᬬํތහୗጱ middleware տਖ਼ http ֢ԅӞӻ݇හփ᭓ᬰ݄҅ইຎ middleware ᯾ڍ ࢧӞӻ Promise ᘏֵአ Generator Function̶
զӥฎຝ᯾ᥴຉ json payload ጱਫሿғ
JavaScript think.middleware('parse_json_payload', http => { let types = http.config('post.json_content_type'); if (types.indexOf(http.type()) === -1) { return; } return http.getPayload().then(payload => { try{ http._post = JSON.parse(payload); }catch(e){} }); });
ᥴຉݸᩙ http Ӥ҅ইғᥴຉփ᭓ᬦጱ xml හ کጱහഝ҅ᆐݸ๕᯿ෛᩙىԶ middleware ݢᚆտᥴຉፘํ ഝ҅֕ݸᖅ๕ݢզ᭗ᬦ http.get ොဩ឴ݐ̶ http.get(xxx) ᧆ឴ݐහഝ҅http._get አਂන GET ݇හ http.post(xxx) ᧆ឴ݐහഝ҅http._post አਂන POST ݇හ http.file(xxx) ᧆ឴ݐහഝ҅http._file አਂනӤփጱկ JavaScript think.middleware('parse_xml', http => { if (!http.payload) { return; } return parseXML(http.payload).then(data => { ොဩ឴ݐ http.post http._post҅ݸᖅݢզ᭗ᬦ ᕳ//ਖ਼ᥴຉݸጱහഝᩙ data; = http._post }); });
᧗ᥠ API -> http̶௳מԭ http ๅग़ى
ᴥྊݸᖅಗᤈ
ෙ҅ইຎӾԧڣܔӞਧկ҅ݢᚆ๕ᴥྊݸᶎጱ᭦ᬋᖀᖅಗᤈ̶ইғIP ἓݷکԶ middleware ಗᤈํ ᧗҅ӧٚಗᤈݸᖅጱ᭦ᬋ̶ڹᮎԍፗളᕷ୮҅ܔἓݷ
ԧ think.prevent ොဩአᴥྊݸᖅጱ᭦ᬋಗᤈಗᤈ҅ᧆොဩฎ᭗ᬦᬬࢧӞӻᇙਧᔄࣳጱ׀ThinkJS Reject Promise ਫሿጱ̶
JavaScript think.middleware('parse_xml', http => { if (!http.payload) { return; } var ip = http.ip(); var blackIPs = ['123.456.789.100', ...]; if(blackIPs.indexOf(ip) > -1){ ᧗ڹhttp.end();//ፗളᕮ୮ //ᴥྊݸᖅጱդᎱᖀᖅಗᤈ think.prevent(); return } });
ᴻԧֵአ think.prevent ොဩᴥྊݸᖅ᭦ᬋᖀᖅಗᤈ҅Ԟݢզ᭗ᬦ think.defer().promise ᬬࢧ Ӟӻ Pending Promise ਫሿ̶
ԧ think.statusAction ොဩਫ׀᧗҅ᘒฎᬬࢧӞӻᲙᶭᶎ҅ThinkJS ڹইຎӧమፗളᕮ୮ ᚆ -> Კ॒ቘ̶ۑሿֵٍ֛҅አොୗ᧗ᥠ ಘ
አᒫӣො middlewareֵ
դᎱਂනࣁىࣁᶱፓ᯾ֵአᒫӣො middleware ݢզ᭗ᬦ think.middleware ොဩਫሿ҅ፘ src/common/bootstrap/middleware.js ᯾̶ইғ JavaScript var parseXML = require('think-parsexml');
think.middleware('parseXML', parseXML);
ݢ̶ܨhook ᯾ کᆐݸਖ਼ parseXML ᯈᗝ
̶ npm ՙପӾ҅middleware ݷᑍവគֵአ think-xxx کݎᶱፓ᯾ጱӞԶ᭗አ middleware Ԟവគ
ᤒڜ ᒫӣො middleware
ᤒ᧗ᥠ ൊկ -> middleware̶ڜ ᒫӣො middleware
Service
ളݗ̶ইຎፗളࣁ controller ᯾ፗള᧣አᬯىইғ᧣አ Github ፘ҅ۓᶱፓ᯾ᵱᥝ᧣አӞԶᒫӣොጱ๐ײํ Զളݗ҅Ӟොᶎᛘ controller դᎱྲ॔҅ݚӞොᶎԞӧᚆๅग़ᬰᤈդᎱ॔አ̶ controller ᯾᧣አ̶ ׀ ݢզ۱ᤰ౮ service҅٭ԭᬯԶఘ
ୌ serviceڠ
ےᚆ -> ThinkJS ե -> Ⴒۑୌեֵٍ֛҅አ᧗ᥠ ಘڠݢզ᭗ᬦե thinkjs service [name] service̶
ݢզ class දԅײݢ҅ᬯܨӞԶᶉாොဩ׀ἕᦊኞ౮ጱ service ฎӞӻ class҅֕ํԶ service ፗള ݢ̶ܨ
serviceے
Ӟӻ service҅ইғے ݢզ᭗ᬦ think.service
JavaScript export default class extends think.controller.base { indexAction(){ let GithubService = think.service('github'); let instance = new GithubService(); } }
service҅ݢզ᭗ᬦӥᶎጱොୗғےইຎమཛྷࣘ JavaScript export default class extends think.controller.base { indexAction(){ service github ཛྷࣘӥጱ admin ے// ;(''admin think.service('github', = GithubService let let instance = new GithubService(); } }
ԧ̶ے҅ୌᦓ service නࣁ common ཛྷࣘӥ҅ݢզ੪᮷ݢզොጱ॔ڦဳ ғইຎᶱፓӧฎᇙ
Cookie cookie ᯈᗝ cookie ἕᦊᯈᗝইӥғ
JavaScript export default { domain: '', path: '/', httponly: false, //ฎވ http only secure: false, ԅᑁ֖ܔԅၨᥦᬰᑕ҅ //ํපᳵ҅0 0 timeout: };
ץᳮᘒ०ප҅ݢզࣁᯈᗝկ src/common/config/cookie.js Ӿᬰᤈىἕᦊ cookie ฎᵋ፳ၨᥦᬰᑕ ද̶ইғ
JavaScript export default { timeout: 7 * 24 * 3600 //ਖ਼ cookie ํපᳵᦡᗝԅ 7 ॠ };
឴ݐ cookie controller ᘏ logic Ӿ҅ݢզ᭗ᬦ this.cookie ොဩ឴ݐ̶ইғ
JavaScript export default class extends think.controller.base { indexAction(){ cookie ጱ theme //឴ݐݷԅ this.cookie('theme'); = cookie let } }
ԧ cookie ොဩ឴ݐ cookie̶ইғ׀http ᯾Ԟ JavaScript let cookie = http.cookie('theme');
ᦡᗝ cookie controller ᘏ logic Ӿ҅ݢզ᭗ᬦ this.cookie ොဩᦡᗝ̶ইғ
JavaScript export default class extends think.controller.base { indexAction(){ default ᦡᗝԅ theme cookie //ਖ਼ 'default'); this.cookie('theme', } }
ԧ cookie ොဩᦡᗝ cookie̶ইғ׀http ᯾Ԟ
JavaScript http.cookie('theme', 'default');
ইғ҅ګදӞԶ݇හ҅ݢզ᭗ᬦᒫӣӻ݇හഴץইຎᦡᗝ cookie మ
JavaScript export default class extends think.controller.base { indexAction(){ this.cookie('theme', 'default', { timeout: 7 * 24 * 3600 //ᦡᗝ cookie ํප๗ԅ 7 ॠ default ᦡᗝԅ theme cookie ਖ਼// ;({ } }
ᴻ cookieڢ
ᴻ̶ইғڢcontroller ᘏ logic Ӿ҅ݢզ᭗ᬦ this.cookie ොဩ
JavaScript export default class extends think.controller.base { indexAction(){ cookie ጱ theme ᴻݷԅڢ// ;(null this.cookie('theme', } }
ᴻ cookie̶ইғڢԧ cookie ොဩ׀http ᯾Ԟ
JavaScript http.cookie('theme', null); Კ॒ቘ
ӧݢۓইғᔮᕹٖ᮱Კ҅url ӧਂࣁ҅ဌํᴴ҅๐̶٭ݱᐿݱጱᲙఘکᔮᕹࣁ॒ቘአಁ᧗҅տ᭬ ӥᵱᥝᕳአಁดᐏଫጱᲙᶭᶎ̶٭አᒵ҅ᬯԶఘ
Კᶭᶎ
Კ॒ቘጱ᭦ᬋկզ݊ፘଫጱᲙᶭᶎ̶ےୌᶱፓ҅տᛔۖႲڠ᭗ᬦ thinkjs ե
Კ᭦ᬋկ᪠ஆԅ src/common/controller/error.js ҅ᧆկٖय़ᛘইӥғ
JavaScript 'use strict'; /** * error controller */ export default class extends think.controller.base { /** * display error page * @param {Number} status [] * @return {Promise} [] */ displayErrorPage(status){ let module = 'common'; if(think.mode !== think.mode_module){ module = this.config('default_module'); } let file = `${module}/error/${status}.html`; let options = this.config('tpl'); options = think.extend({}, options, {type: 'ejs'}); return this.display(file, options); } /** * Bad Request * @return {Promise} [] */ _400Action(){ return this.displayErrorPage(400); } /** * Forbidden * @return {Promise} [] */ _403Action(){ return this.displayErrorPage(403); } /** * Not Found * @return {Promise} [] */ _404Action(){ return this.displayErrorPage(404); } /** * Internal Server Error * @return {Promise} [] */ _500Action(){ return this.displayErrorPage(500); } /** * Service Unavailable * @return {Promise} [] */ _503Action(){ return this.displayErrorPage(503); } }
ଫጱཛྷᇇկ᪠ஆԅ view/common/error_{Number}.html ̶
Კᔄࣳ
ᔮᕹἕᦊඪ೮ጱᲙᔄࣳํ 400 ҅ 403 ҅ 404 ҅ 500 503 ̶
400
Კጱ᧗҅ইғ௶᭜ӞԶᶋဩጱහഝᦢᳯ̵ᦢᳯጱ url ӧݳဩᒵ̶
403
ᦢᳯဌํᴴ̶ڹ୮
404
ᦢᳯጱ url ӧਂࣁ̶
500
᧗ӧݢአ̶ڹሿᲙ҅ᛘ୮ڊᔮᕹٖ᮱
503 ௩॔ݸᚆᦢᳯ̶کӧݢአ҅ᵱᥝᒵۓ๐
ಘᲙᔄࣳ
ӞӻᶱፓᇙํጱᲙ 600 ҅ᮎԍݢզ᭗ᬦӥᶎྍṈᬰᤈғےইႲᶱፓ᯾ݢզ໑ഝᵱᥝಘᲙᔄࣳ҅
600Action_ ے1̵Ⴒ
ইӥጱդᎱғےࣁ src/common/controller/error.js կӾ҅ݳᭇጱ֖ᗝႲ
JavaScript _600Action(){ return this.displayErrorPage(600); }
Კᶭᶎے2̵Ⴒ
ดᐏጱᲙ̶ٖےկ view/common/error_600.html ҅ଚࣁկ᯾ႲےႲ
3̵ดᐏᲙᶭᶎ
ݢզ᭗ᬦ think.statusAction ොဩਫ҅کਠᲙݸ҅ᵱᥝࣁଫࣈො᧣አดᐏᲙᚆᦏአಁ፡ےႲ ሿ̶ইғ
JavaScript export default class extends think.controller.base { indexAction(){ if(someError){ return think.statusAction(600, this.http); //ดᐏ 600 Კ҅ᵱᥝਖ਼ http փ᭓ᬰ݄ } } }
දᲙᶭᶎୗץ
දཛྷᇇկץڞද 404 Კץݢ҅ইғܨදଫጱཛྷᇇկץදᲙᶭᶎୗ҅ݝᵱᥝץ view/common/error_404.html ̶
௳מᲙ
EPERM
Operation Not Permitted ᦶಗᤈԶᵱᥝᇙྛᴴጱ̶֢
ENOENT
No Such File Or Directory
᭗ଉኧկᔮᕹ֢᩸҅ྲই᪠ஆӾӻᕟկਧጱ᪠ஆկଚӧਂࣁ̶
EACCES
Permission Denied
ᕷᦢᳯ̶
EEXIST
File Exists
̶٭ԧፓຽਂࣁጱఘکᥝፓຽӧਂࣁጱ֢᭬
ENOTDIR
Not a Directory
ᕳਧጱ᪠ஆਂࣁ҅֕ӧฎమᥝጱկ४̶᭗ଉኧ fs.readdir ̶᩸
EISDIR
Is a Directory
ฎկ४̶ܩ֢ጱፓຽฎկ҅֕ᕳਧጱ
EMFILE
Too Many Open Files In System
ᳮӞӻᚆ᧗ጱկ̶ىӤᴴ҅ᛗکᔮᕹጱկහᰁ૪ᕪᬡ
ݢզࣁᬩᤈNode.jsᬰᑕጱݶӞӻsh҅ګሿ҅ᥝṛᴴڊᦜᬦग़կݶጱᔮᕹҁইOS X҂Ӿر᭗ଉӧ Ӿᬩᤈ ulimit -n 2048 ̶
EPIPE Broken Pipe
හഝጱᬱᑕ๐ف፳ྋݻٌӾٟޱሿ҅ڊᓕ̵᭲ॺೲਁFIFOݝํٟᘒဌํ̶᭗ଉࣁ net http ੶ ᳮ̶ى૪ۓ
EADDRINUSE
Address Already In Use
አ̶ܛӞӻࣈࣈ࣎҅֕ᧆࣈ࣎૪ᕪᤩکᕬਧۓᦶ๐
ECONNRESET
Connection Reset By Peer
ᘒӶ०ᬳളᛘ̶ଉᥠԭ httpސӾኧԭᒒ᩻᯿מᳮ̶᭗ଉࣁᬱᑕॺളਁ᭗ىګᬳളᤩᒒ୩ net ཛྷ̶ࣘ
ECONNREFUSED
Connection Refused
ኞ̶ݎፓຽ᷇ᔺᕷᛘ෫ဩୌᒈᬳള̶᭗ଉࣁᦶᬳളक़᮱ᶋၚۖԆ
ENOTEMPTY
Directory Not Empty
̶ կ४ᶋᑮ҅ଉᥠԭ᧣አ fs.unlinkڹ֢ፓຽฎᑮկ४҅֕୮
ETIMEDOUT
Operation Timed Out
ሿ҅Ӟᛱᤒกᬳളጱॺളਁဌํڊፓຽ᩻ᬦ෬ਧᳵ๚ߥଫ᭜౮ᬳള᧗०ᨳ̶᭗ଉࣁ http net Ӿ ᭇ୮ .end() ̶
හഝ໊ḵ
឴ݐአಁԻᬦጱහഝ҅ᆐݸٌ໊ḵ҅ইຎ໊ḵဌᳯ᷌ݸض୮ࣁ Action ᯾॒ቘአಁጱ᧗҅ᕪଉᥝ ෙ෫ݸᚆᬰᤈ፥ྋጱ᭦ڣෙ҅ᒵᬯԶ᮷ڣᬮᥝᬰᤈᴴײᚆᬰᤈݸᖅጱ̶֢୮݇හ໊ḵਠ౮ݸ҅ํ ᬋ॒ቘ̶ইຎਖ਼ᬯԶդᎱ᮷නࣁӞӻ Action ᯾҅۠ᦏ Action ጱդᎱᶋଉ॔Ӭٞᳩ̶ ᯾ጱ Action ӞګԧӞ੶ Logic ҅Logic ᯾ጱ Action ഴےᶎीڹګԅԧᥴ٬ᬯӻᳯ᷌҅ ThinkJS ࣁഴ տᛔۖ᧣አ Logic ᯾ጱ Action̶ڹ᯾ጱ Action ԏګӞଫ҅ᔮᕹࣁ᧣አഴ
Logic ੶
ୌ Controller տڠ [Logic ፓ୯ࣁ src/[module]/logic ҅ࣁ᭗ᬦե thinkjs controller [name ୌଫጱ Logic̶Logic դᎱᔄ֒ইӥғڠᛔۖ
JavaScript 'use strict'; /** * logic * @param {} [] * @return {} [] */ export default class extends think.logic.base { /** * index action logic * @return {} [] */ indexAction(){
} }
Ӿ҅Logic ᯾ጱ Action Controller ᯾ጱ Action ӞӞଫ̶Logic ᯾Ԟඪ೮ __before __after ᒵٌ ṹොဩ̶
හഝ໊ḵᯈᗝ
හഝ໊ḵጱᯈᗝইӥғ
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { doc: "string|default:index", version: "string|in:1.2,2.0|default:2.0" } } }
ᯈᗝ໒ୗ
ᯈᗝ໒ୗԅ ਁྦྷݷ -> ᯈᗝ ҅ྯӻਁྦྷጱᯈᗝඪ೮ग़ӻ໊ḵᔄ໊ࣳ҅ḵᔄࣳԏᳵአ | ᵍ໊҅ḵᔄࣳ ݇හԏᳵአ : ᵍ҅݇හԏᳵአ , ᵍඪ೮ग़ӻ݇හ̶ ݇හ໒ୗ
හक़҅ᬮݢզඪ೮ JSON ໒ୗጱ॔݇හ̶ইғ݇ܔḵᔄࣳݸᶎݢզള݇හ҅ᴻԧඪ೮አ᭖ݩᵍጱᓌ໊
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { field1: "array|default:[1,2]", //݇හԅහᕟ field2: 'object|default:{\"name\":\"thinkjs\"}' //݇හԅ } } }
ඪ೮ጱහഝᔄࣳ
ඪ೮ጱහഝᔄࣳํғ boolean ̵ string ̵ int ̵ float ̵ array ̵ object ҅ἕᦊԅ string ̶
ἕᦊ
ጱکᥟፍᬦ݄҅ݸᖅ឴ݐԅᑮ҅տਖ਼ἕᦊྦྷਁڹইຎ୮҅አ default:value ਧԎਁྦྷጱἕᦊֵ ̶ԅᧆἕᦊ
឴ݐහഝጱොୗ
᧗ᔄࣳฎ GET҅ᮎԍտ᭗ᬦڹইຎ୮҅᧗ጱᔄࣳ឴ݐਁྦྷଫጱڹἕᦊ໑ഝ୮ ইຎ᧗ᔄࣳฎ POST҅ᮎԍտ᭗ᬦ this.post̶this.get('version') ឴ݐ version ਁྦྷጱ ̶឴ݐਁྦྷጱ
੪ᵱᥝਧ឴ݐහഝጱײࣁ POST ᔄࣳӥ҅ݢᚆտ឴ݐӤփጱկᘏ឴ݐ URL Ӥጱ݇හ҅ᬯײํ֕ ̶ ොୗԧ̶ඪ೮ጱ឴ݐහഝොୗԅ get ҅ post file
JavaScript export default class extends think.logic.base { /** ᧗ හഝ҅POSTਂכ * * @return {} [] */ saveAction(){ let rules = { name: "required", image: "object|file|required", version: "string|get|in:1.2,2.0|default:2.0" } } } ྦྷਁ҅image ᭗ᬦ file ොୗ឴ݐ ྦྷਁ҅Ӥᶎᐏֺਧԧਁྦྷ name ᭗ᬦ post ොဩ឴ݐ ̶version ᭗ᬦ get ොୗ឴ݐ
௳מᲙ
ඪ೮ࢵᴬ۸҅ᵱ௳מᲙ̶௳מጱᲙڊᲙݸᕳڊଚဌํਧ໊ḵ҅ڞӤᶎጱᯈᗝݝฎਧԧٍ֛ጱ໊ḵᥢ ᥝࣁᯈᗝկ src/common/config/locale/[lang].js ӾਧԎ̶ইғ
JavaScript // src/common/config/locale/en.js export default { validate_required: '{name} can not be blank', validate_contains: '{name} need contains {args}', }
դᤒਁྦྷݷڦړ᯾ᶎඪ೮ {name} {args} 2ӻ݇හ҅҅ Ӿ key ԅ validate_ + ໊ḵᔄࣳݷᑍٌ ᑍփ᭓ጱ݇හ̶
Ӥਁྦྷݷ̶ইғےݢզ᭗ᬦࣁݸᶎ҅௳מইຎమਧԎӻᇙਧਁྦྷӻᲙᔄࣳጱٍ֛
JavaScript // src/common/config/locale/en.js export default { validate_required: '{name} can not be blank', ௳מᲙ required ጱ email //ਧਁྦྷ blank', be not can 'email validate_required_email: }
හഝ໊ḵොဩ
ݸ҅ݢզ᭗ᬦ this.validate ොဩᬰᤈ໊ḵ̶ইғڞᯈᗝঅ໊ḵᥢ
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { doc: "string|default:index", version: "string|in:1.2,2.0|default:2.0" } let flag = this.validate(rules); if(!flag){ return this.fail('validate error', this.errors()); } } }
ݸ҅ݢզ௳מᲙک೭̶௳מԅ false ҅ᮎԍݢզ᭗ᬦ this.errors ොဩ឴ݐᧇᕡጱᲙইຎᬬࢧ Ӟӻᶭᶎ̶ڊԞݢզ᭗ᬦ this.display ොဩᬌ҅ڊզ JSON ໒ୗᬌ௳מ᭗ᬦ this.fail ොဩᲙ
ҁզ ejs ཛྷᇇԅֺ҂ғ௳מཛྷᇇ᯾҅ཛྷᇇ᯾᭗ᬦӥᶎጱොୗดᐏᲙک᭗ᬦ errors ਁྦྷᩙ௳מᲙ
Markup <%for(var field in errors){%> <%-field%>:<%errors[field]%> <%}%>
ᛔ໊ۖḵ
ইຎྯེ᮷ᥝࣁ Logic ጱ Action ಋۖ᧣አ̶௳מ Ӟӻ JSONڊӥ҅᮷ฎ໊ḵํᳯ᷌ݸ҅ᬌ٭Ӟᛱఘ ᕳ this.rules ંᬰᤈᛔ໊ۖᩙڞthis.validate ᬰᤈ໊ḵ҅۠ྲἋᅸ̶ݢզ᭗ᬦਖ਼໊ḵᥢ ḵ̶ইғ
JavaScript export default class extends think.logic.base { indexAction(){ this.rules = { doc: "string|default:index", version: "string|in:1.2,2.0|default:2.0" } } }
ڊፗളᬌڞᕳ this.rules ંݸ҅տࣁᬯӻ Action ಗᤈਠ౮ݸᛔ໊ۖḵ҅ইຎํᲙᩙڞਖ਼໊ḵᥢ ᛔ໊ۖḵฎ᭗ᬦṹොဩ __after ਠ౮ጱ̶̶௳מJSON ໒ୗጱᲙ
ඪ೮ጱ໊ḵᔄࣳ required
ऴᶱ̶
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { ऴጱ //name 'required' name: } } } requiredIf
ӾӞᶱ҅ᧆᶱऴ̶ইғٌԅԶ୮ݚӞӻᶱጱ JavaScript export default class extends think.logic.base { indexAction(){ let rules = { name: 'requiredIf:email,[email protected],[email protected]' } } }
ऴ̶ԅ [email protected] ҅ [email protected] ᒵٌӾӞᶱ҅ name ጱ୮ email ጱ requiredNotIf
Ӿ҅ᧆᶱऴ̶ইғӧࣁԶ୮ݚӞӻᶱጱ
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { name: 'requiredNotIf:email,[email protected],[email protected]' } } }
ӧԅ [email protected] ҅ [email protected] ᒵٌӾӞᶱ҅ name ጱ୮ email ጱ ऴ̶ requiredWith
ࣁ҅ᧆᶱऴ̶ਂᶱํӞᶱپ୮ٌ՜
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { name: 'requiredWith:email,title' } } }
ऴ̶ࣁ҅ name ጱਂ୮ email , title ᒵᶱํӞᶱ requiredWithAll
᮷ਂࣁ҅ᧆᶱऴ̶ᶱپ୮ٌ՜ JavaScript export default class extends think.logic.base { indexAction(){ let rules = { name: 'requiredWithAll:email,title' } } }
ऴ̶᮷ਂࣁ҅ name ጱ୮ email , title ᒵᶱ requiredWithout
ӧਂࣁ҅ᧆᶱऴ̶ᶱํӞᶱپ୮ٌ՜
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { name: 'requiredWithout:email,title' } } }
ऴ̶ӧਂࣁ҅ name ጱ୮ email , title ᒵᶱٌӾํӞᶱ requiredWithoutAll
᮷ӧਂࣁ҅ᧆᶱऴ̶ᶱپ୮ٌ՜
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { name: 'requiredWithoutAll:email,title' } } }
ऴ̶᮷ӧਂࣁ҅ name ጱ୮ email , title ᒵᶱ contains
̶ӻᇙਧጱތᵱᥝ۱ JavaScript export default class extends think.logic.base { indexAction(){ let rules = { thinkjs̶ ᒧԀਁތ//ᵱᥝ۱ 'contains:thinkjs' name: } } } equals
ፘᒵ̶ݚӞᶱጱ
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { name: 'equals:firstname' } } }
ፘᒵ̶ᵱᥝ firstname ጱname ጱ different
ӧᒵ̶ݚӞᶱጱ
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { name: 'different:firstname' } } }
ፘᒵ̶ӧᚆ firstname ጱname ጱ before
̶ڹ෭๗ԏڹᵱᥝࣁӞӻ෭๗ԏݸ҅ἕᦊԅᵱᥝࣁ୮ JavaScript export default class extends think.logic.base { indexAction(){ let rules = { ̶ڹ෭๗ԏڹ//ᵱᥝࣁ୮ 'before', start_time: ̶ڹԏ 10:10:10 2015/10/12 //ᵱᥝࣁ 10:10:10' 'before:2015/10/12 start_time1: } } } after
෭๗ԏݸ̶ڹᵱᥝࣁӞӻ෭๗ԏݸ҅ἕᦊԅᵱᥝࣁ୮
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { ෭๗ԏݸ̶ڹ//ᵱᥝࣁ୮ 'after', end_time: ԏݸ̶ 2015/10/10 //ᵱᥝࣁ 'after:2015/10/10' end_time1: } } } alpha
ݝᚆฎ [a-zA-Z] ᕟ౮̶
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { en_name: 'alpha' } } }
ݝᚆฎ [a-zA-Z] ᕟ౮̶en_name ጱ alphaDash
ݝᚆฎ [a-zA-Z_] ᕟ౮̶ alphaNumeric
ݝᚆฎ [a-zA-Z0-9] ᕟ౮̶ alphaNumericDash
ݝᚆฎ [a-zA-Z0-9_] ᕟ౮̶ ascii
ݝᚆฎ ascii ਁᒧᕟ౮̶ base64
ᶳฎ base64 ᖫᎱ̶ byteLength
ᳵ̶ٖ܄ᳩଶᵱᥝࣁӞӻᜓਁ
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { name: 'byteLength:10' //ਁᜓᳩଶӧᚆੜԭ 10 name1: 'byteLength:10,100' //ਁᜓᳩଶᵱᥝࣁ 10 - 100 ԏᳵ } } } creditcard
හਁ̶ܜአמᵱᥝฎ currency
ᵱᥝฎᨵ૰̶ date
ᵱᥝฎӻ෭๗̶ decimal
ᵱᥝฎӻੜහ̶ divisibleBy
ᵱᥝᤩӞӻහෆᴻ̶ JavaScript export default class extends think.logic.base { indexAction(){ let rules = { ෆᴻ 3 //ݢզᤩ 'divisibleBy:3' count: } } } email
ᵱᥝฎӻ email ໒ୗ̶ fqdn
ᵱᥝฎӻݳ໒ጱऒݷ̶
float
ᵱᥝฎӻၶᅩහ̶
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { money: 'float' //ᵱᥝฎӻၶᅩහ 3.2 ԅ//ᵱᥝฎӻၶᅩහ҅Ӭ๋ੜ 'float:3.2' money1: 10.5 ԅ3.2๋҅य़ ԅ//ᵱᥝฎӻၶᅩහ҅Ӭ๋ੜ 'float:3.2,10.5' money2: } } } fullWidth
ᒧ̶ਁᜓਁ਼ތ۱ halfWidth
ਁᜓਁᒧ̶ތ۱ hexColor
̶᷏ᜋګᬰم܈ᵱᥝฎӻ hex ̶ګᬰم܈ᵱᥝฎ ip
ᵱᥝฎ ip ໒ୗ̶ ip4
ᵱᥝฎ ip4 ໒ୗ̶ ip6
ᵱᥝฎ ip6 ໒ୗ̶ isbn
ᵱᥝฎࢶԡᖫᎱ̶ isin
ᖫᎱ̶ڦᦩڭᵱᥝฎᦤ iso8601
ᵱᥝฎ iso8601 ෭๗໒ୗ̶ in
Ӿ̶ࣁԶ
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { ٌӾӞӻ 1.2҅2.0 //ᵱᥝฎ 'in:1.2,2.0' version: } } } noin
Ӿ̶ӧᚆࣁԶ JavaScript export default class extends think.logic.base { indexAction(){ let rules = { ٌӾӞӻ 1.2҅2.0 //ӧᚆฎ 'noin:1.2,2.0' version: } } } int
ᵱᥝฎ int ̶ࣳ
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { value: 'int' //ᵱᥝฎ int ࣳ value1: 'int:1' //ӧᚆੜԭ1 value2: 'int:10,100' //ᵱᥝࣁ 10 - 100 ԏᳵ } } } min
̶ӧᚆੜԭӻ
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { value: 'min:10' //ӧᚆੜԭ10 } } } max
̶ӧᚆय़ԭӻ JavaScript export default class extends think.logic.base { indexAction(){ let rules = { value: 'max:10' //ӧᚆय़ԭ10 } } } length
ᳩଶᵱᥝࣁӻࢱ̶
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { name: 'length:10' //ᳩଶӧᚆੜԭ10 name1: 'length:10,100' //ᳩଶᵱᥝࣁ 10 - 100 ԏᳵ } } } minLength
ᳩଶӧᚆੜԭ๋ੜᳩଶ̶
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { name: 'minLength:10' //ᳩଶӧᚆੜԭ10 } } } maxLength
ᳩଶӧᚆय़ԭ๋य़ᳩଶ̶ JavaScript export default class extends think.logic.base { indexAction(){ let rules = { name: 'maxLength:10' //ᳩଶӧᚆय़ԭ10 } } } lowercase
ᵱᥝ᮷ฎੜٟਁྮ̶ uppercase
ᵱᥝ᮷ฎय़ੜਁྮ̶ mobile
ᵱᥝಋݩ̶
JavaScript export default class extends think.logic.base { indexAction(){ let rules = { //ᶳԅӾࢵጱಋݩ 'mobile:zh-CN' mobile: } } } mongoId
ฎ MongoDB ጱ ObjectID̶ multibyte
ग़ਁᜓਁᒧ̶ތ۱ url
ฎӻ url̶ order
හഝପັᧃ order҅ইғname DESC̶ field
හഝପັᧃጱਁྦྷ҅ইғname,title̶ image
Ӥփጱկฎވฎӻࢶᇆ̶ startWith
զԶਁᒧ१̶ endWith
զԶਁᒧᕮ̶ string
ԅਁᒧԀ̶ array
ԅහᕟ̶ boolean
ԅਫ਼ᔄ̶ࣳ object
ԅ̶
ಘ໊ḵᔄࣳ
ইຎἕᦊඪ೮ጱ໊ḵᔄࣳӧᚆჿ᪃ᵱ҅ݢզ᭗ᬦ think.validate ොဩ໊ḵᔄࣳᬰᤈಘ̶ইғ
JavaScript // src/common/bootstrap/validate.js think.validate('validate_name', (value, ...args) => { //ᵱᥝᬬࢧ true ᘏ false ᤒᐏ໊ḵ०ᨳ false҅ۑᤒᐏ໊ḵ౮ true// })
ӤᶎဳٙԧӞӻݷԅ validate_name ጱ໊ḵᔄࣳ҅ᬯࣁ Logic ᯾੪ݢզፗളֵአᧆ໊ḵᔄࣳԧ̶ ݇හᥴຉ
ጱ݇හฎٌ՜ਁྦྷݷᑍ҅֕ྲکᬰᤈྲ҅ᬯ೭᪙ٌ՜ਁྦྷইຎᥝᥴຉݸᶎጱ args ҅ইғᧆਁྦྷ ̶ಅզᵱᥝਖ਼ਁྦྷݷᑍᥴຉԅଫጱਁྦྷ҅ᬯӻਁྦྷکᙗਧᵱᥝ೭ײጱ
හਠ౮̶ইғӤᶎጱ໊ḵᔄࣳݷᑍԅ validate_name ҅ᮎԍଫጱᥴຉ݇ڍݢզ᭗ᬦဳٙӞӻᥴຉ݇හ ̶ ғ _ + ໊ḵᔄࣳܨ҅ හጱݷᑍᶳԅ _validate_name
JavaScript think.validate('_validate_name', (args, data) => { let arg0 = args[0]; //ਖ਼ᒫӞӻ݇හਁྦྷݷᑍᥴຉԅଫጱ݇හ data[arg0].value; = args[0] return args; })
ࢵᴬ۸
឴ݐ
አಁጱ̶ইғڹݢզ᭗ᬦ http.lang ොဩ cookie ᘏ header ᯾឴ݐ୮
JavaScript let lang = http.lang();
ইຎᥝඪ೮ cookie ᯾឴ݐአಁᭌೠጱ҅ᮎԍᵱᥝᦡᗝࣁ cookie ᯾ጱݷᑍ̶ݢզࣁᯈᗝկ ද҅ইғץsrc/common/config/locale.js ᯾
JavaScript export default { ݷᑍ cookie //ਂනጱ 'think_locale', cookie_name: default: 'en' //ἕᦊ };
ࣁ Controller ᯾ݢզፗള᭗ᬦ this.lang ොဩ឴ݐଫጱ̶
URL Ӿᥴຉ
ᶭᶎጱࣈ࣎ฎڹӥ҅ฎᥝ URL Ӿᥴຉ̶ྲইғ୮٭Զఘํ ̶ ԧ zh-CNތhttps://www.thinkjs.org/zh-CN/doc/2.0/i18n.html ҅੪۱
ӥᵱᥝࣁᶱፓ᯾᭗ᬦ middleware ᥴຉٌӾጱ҅ইғ٭ᬯᐿఘ JavaScript think.middleware('get_lang', http => { let supportLangs = think.config('locale.support'); Ӿ឴ݐ URL // http.pathname.split('/')[0]; = lang let
if(supportLangs.indexOf(lang) > -1){ http.pathname = http.pathname.substr(lang.length + 1); }else{ Ӿ឴ݐ header ᘏ cookie // http.lang(); = lang if(supportLangs.indexOf(lang) === -1){ lang = http.config('locale.default'); //ἕᦊඪ೮ጱ } } ፓ୯ے//ᦡᗝ҅ଚᦡᗝཛྷᇇ᪠ஆӾႲ true); http.lang(lang, });
ݸ҅᭗ᬦ http.lang ොဩᦡᗝ҅ݸᖅࣁ Controller ᯾ݢզፗള᭗ᬦک URL Ӿᥴຉ http.lang ឴ݐԧ̶
ଫጱ hook ᯾̶ইғکےਧԎ middleware get_lang ݸ҅Ⴒ
JavaScript export default { ᯾ hook route_parse کےᗝႲڹ get_lang //ਖ਼ 'get_lang'], ['prepend', route_parse: }
ݒᰁᯈᗝ
ᯈᗝկࣁ҅ඪ೮ࢵᴬ۸ጱᶱፓᵱᥝᯈᗝݒᰁࣁӧݶӥጱ src/common/config/locale/[lang].js ҅ᯈᗝ໒ୗইӥғ
JavaScript // src/common/config/locale/zh-CN.js export default { 'title-home': 'ThinkJSਥᗑ - A Node.js MVC Framework Support All Of ES6/7 Features', 'title-changelog': 'ๅෛ෭ப - ThinkJSਥᗑ', }
JavaScript // src/common/config/locale/en.js export default { 'title-home': 'ThinkJS - A Node.js MVC Framework Support All Of ES6/7 Features', 'title-changelog': 'Changelog - ThinkJS' }
឴ݐݒᰁ ইғ̶ଫጱݒᰁڹᯈᗝݒᰁݸ҅ݢզ᭗ᬦ http.locale ොဩ឴ݐ୮
JavaScript let homeTitle = http.locale('title-home');
ইຎࣁ Controller Ӿ҅ݢզፗള᭗ᬦ this.locale ොဩ឴ݐ҅ইғ
JavaScript export default class extends think.controller.base { indexAction(){ let homeTitle = this.locale('title-home'); } }
ཛྷᇇ᯾ֵአݒᰁ
ӥᶎզ ejs ཛྷᇇකԅֺғ̶හ឴ݐଫጱڍ _ ཛྷᇇ᯾ݢզ᭗ᬦ
Markup <%- _('title-home') %>
ᦡᗝཛྷᇇ᪠ஆ
Ӟ੶ፓ୯॒ቘ੪ྲݳᭇԧ̶ےӧݶጱཛྷᇇ҅ᬯཛྷᇇ᪠ஆ᯾ګԶᶱፓӾ҅ᵱᥝ໑ഝӧݶጱਧํ ԧӞ੶ zh-CN ፓ୯̶ےইғ view/zh-CN/home/index_index.html ҅᪠ஆӾႲ
Ӟ੶ፓ୯̶ইғےݢզ᭗ᬦ http.lang ොဩᦡᗝଚᦡᗝࣁཛྷᇇ᪠ஆ᯾Ⴒ
JavaScript Ӟ੶ፓ୯ےᤒᐏࣁཛྷᇇ᪠ஆ᯾Ⴒ true // true); http.lang(lang,
ࣁ Controller ᯾ݢզ᭗ᬦ this.lang ොဩᦡਧ̶ইғ
JavaScript export default class extends think.controller.base { indexAction(){ let lang = getFromUrl(); this.lang(lang, true); ... } }
᪠ஆଉᰁ
አᬯԶଉᰁݢզොጱᦢᳯଫጱկ̶ڥᶱፓ᯾ֵአ҅׀ԧஉग़ଉᰁ׀ᔮᕹ think.ROOT_PATH
ᶱፓጱ໑ፓ୯̶ think.RESOURCE_PATH
ᶉாᩒრ໑ፓ୯҅᪠ஆԅ think.ROOT_PATH + /www/ ̶ think.APP_PATH
APP դᎱፓ୯҅᪠ஆԅ think.ROOT_PATH + /app/ ̶ think.THINK_PATH
ThinkJS ຝጱ໑ፓ୯̶ think.THINKLIBPATH
ThinkJS ຝ lib ፓ୯̶ think.getPath(module, type)
ݢ̶Ӟӻࢴਧጱ᪠ஆڊԭ model҅controller҅view ᒵፓ୯҅ኧԭྯӻཛྷࣘӥ᮷ํᬯԶፓ୯҅ಅզ෫ဩᕳ զ᭗ᬦ think.getPath ឴ݐཛྷࣘӥጱ᪠ஆ̶
JavaScript ጱፓ୯ model ӥ common //឴ݐ 'model'); think.getPath('common', = path1 let ጱፓ୯ controller ཛྷࣘӥ home //឴ݐ 'controller'); think.getPath('home', = path2 let
ᛔਧԎ᪠ஆଉᰁ
ᴻԧ᭗ᬦᔮᕹᕳጱંᘏොဩ឴ݐ᪠ஆ҅ᬮݢզࣁᶱፓ᯾ਧԎ᷐क़ጱ᪠ஆଉᰁ̶
ݗկ᯾ਧԎف
ݗկ᯾ਧԎӞԶ᪠ஆفݗկԅ src/index.js ᘏ src/production.js ᒵ҅ݢզࣁᬯԶفᶱፓጱ ଉᰁ̶ইғ JavaScript var thinkjs = require('thinkjs'); var path = require('path');
var rootPath = path.dirname(__dirname);
var instance = new thinkjs({ APP_PATH: rootPath + '/app', ROOT_PATH: rootPath, RESOURCE_PATH: __dirname, UPLOAD_PATH: __dirname + '/upload', // ਧԎկӤփጱፓ୯ env: 'development' });
instance.run();
կ᯾ਧԎۖސ
҅ಅզԞݢզࣁᬯԶկ᯾ਧԎ᪠ஆےտᛔۖۖސਧԎࣁ src/common/bootstrap ᯾ጱկࣁᶱፓ ଉᰁ̶ইғ
JavaScript // src/common/bootstrap/common.js think.UPLOAD_PATH = think.RESOURCE_PATH + '/upload'; //ਧԎկӤփጱፓ୯
REST API
ᒫӣොֵአ҅Ӟӻ᭗አጱ API ᦡᦇᥢ੪ฎֵአ REST API̶REST API ฎ׀ Ӟӻ API׀ᶱፓӾ҅ᕪଉᥝ አ HTTP Ӿጱ᧗ᔄࣳຽᦩᩒრጱ̶֢ইғֵ
ᤒڜGET /ticket #឴ݐticket GET /ticket/12 #ັ፡ӻٍ֛ጱticket POST /ticket #ෛୌӞӻticket PUT /ticket/12 #ๅෛticket 12 ᴻticekt 12ڢ# DELETE /ticket/12
ݢߥଫ REST API ጱ॒ቘ҅ݶܨୌݸ෫ᵱ᷐क़ጱդᎱڠୌ REST API҅ڠԧஉഠጱොୗ׀ThinkJS Ӿ ߥଫ᷐क़ጱᵱ̶ګԞݢզ᭗ᬦਧ
ୌ REST APIڠ
ୌӞӻ REST API̶ইғڠݢܨ ᭗ᬦ thinkjs controller [name] --rest
JavaScript thinkjs controller home/ticket --rest ୌԧӞӻ ticket ጱ Rest Controller҅ᧆ Controller አ॒ቘᩒრڠӤᶎጱեᤒᐏࣁ home ཛྷࣘӥ ticket ጱ᧗̶
॒ቘ REST API ᧗
ݢਠ౮ REST API ጱ॒ቘ̶ᩒრݷᑍහഝᤒݷᑍฎܨୌਠ౮ݸ҅෫ᵱٟձ֜ጱդᎱ҅ڠ Rest Controller ̶ ᖗ + ticketڹӞӞଫጱ҅ইғᩒრݷԅ ticket ҅ᮎԍଫጱහഝᤒԅ හഝᤒ
᧗ᔄࣳ
᧗ᔄࣳฎ DELETE ҅ᤒᐏᩒڹጱ᧗ᔄࣳጱ҅ইғ୮ڹREST API ἕᦊฎ HTTP METHOD ᯾឴ݐ୮ ᴻ̶֢ڢრᬰᤈ
ᭆ DELETE ᧗ᔄࣳ҅ᮎԍݢզ᭗ᬦં _method ਧӞӻ݇හአളත᧗ݎইຎํԶਮಁᒒӧඪ೮ ᔄ̶ࣳইғ
JavaScript export default class extends think.controller.rest { init(http){ super.init(http); ᯾឴ݐ _method ݇හ GET //ਧ᧗ᔄࣳ '_method'; = this._method } }
ਁྦྷᬦᄁ
ݢզ᭗ᬦࣁ҅ྦྷਁړᵱᥝᵌᡐ᮱ײ҅տਖ਼ᩒრጱಅํਁྦྷ᮷ᬬࢧ̶ํ௳מӥ҅឴ݐᩒრ٭ἕᦊఘ before ṹොဩ᯾ਠ౮ྌᔄ̶֢__
JavaScript export default class extends think.controller.rest { __before(){ this.modelInstance.fieldReverse('password,score'); //ᵌᡐ password score ਁྦྷ } }
ᴴᓕቘ
ݢզ᭗ᬦࣁ __before ṹොဩ᯾҅௳מԶ REST API ᵱᥝᬰᤈᴴḵᦤ҅ḵᦤਠ౮ݸᚆ឴ݐଫጱํ ᬰᤈḵᦤ̶ JavaScript export default class extends think.controller.rest { * __before(){ let auth = yield this.checkAuth(); if(!auth){ return this.fail('no permissions'); //ဌᴴፗളᬬࢧ } } }
ګๅग़ਧ
ොୗ᧗݇ᥠ API -> controller.rest̶ګๅग़ਧ
ۓਧձ
॒ቘԧ̶ThinkJS ඪ೮եۓ੪ᵱᥝֵአਧձײᚆ҅ᬯۑᶱፓࣁᕚӤᬩᤈ҅ᕪଉᥝਧ݄ಗᤈӻ ̶ۓᚆݢզஉঅጱඪ೮ਧձۑ ᤈොୗ᧣አ҅ᕮݳᔮᕹጱ crontab
եᤈಗᤈ
ThinkJS ᴻԧඪ೮᭗ᬦ URL ᦢᳯಗᤈक़҅ᬮݢզ᭗ᬦեᤈጱොୗ᧣አಗᤈ̶ֵአොୗইӥғ
Bash node www/production.js home/index/index
Ӥᶎጱեᤒᐏಗᤈ home ཛྷࣘӥ index Controller ᯾ጱ indexAction̶
൭ଃ݇හ
ݢғܨӤଫጱ݇හےහ҅ݝᥝࣁݸᶎ݇ےইຎᵱᥝ
Bash node www/production.js home/index/index?name=thinkjs
Action ᯾੪ݢզ᭗ᬦ this.get ොဩ឴ݐ݇හ name ԧ̶
ද᧗ොဩץ
եᤈಗᤈἕᦊጱ᧗ᔄࣳฎ GET҅ইຎమදԅٌ՜ጱᔄࣳ҅ݢզአӥᶎጱොဩғ
Bash node www/production.js url=home/index/index&method=post
ᒧԧҁݢզ᭗ᬦ / ጱොୗਁ & ތ᯾੪ӧᚆ۱ᬯ੪᧗ᔄࣳදԅԧ post̶֕ᬯᐿොୗӥ҅݇හ url ጱ ਧ݇හ҅ই node www/production.js url=home/index/index/foo/bar&method=post ҂̶
දӥᶎጱ݇හғץද᧗ᔄࣳ҅ᬮݢզץᴻԧ
ද᧗ጱ host ἕᦊԅ 127.0.0.1ץ host ද᧗ጱ ip ἕᦊԅ 127.0.0.1ץ ip
ද headerץ
දๅग़ጱ headers҅ݢզփӞӻਠෆጱ json හഝ҅ইғץইຎమײํ
Bash node www/production.js {"url":"/index/index","ip":"127.0.0.1","method":"POST","headers":{"xxx":"yyyy"
ᐬྊ URL ᦢᳯ
ᧆ Action҅ݢզ᭗ᬦکইຎᐬྊ URL ᦢᳯ̶کӥ҅եᤈಗᤈጱ Action ᭗ᬦ URL Ԟݢզᦢᳯ٭ἕᦊఘ ෙ̶ইғڣthink.cli
JavaScript export default class extends think.controller.base { indexAction(){ //ᐬྊ URL ᦢᳯᧆ Action if(!think.cli){ this.fail('only invoked in cli mode'); } ... } }
ಗᤈᚕ
ጱಗᤈᚕ᧣አեᤈಗᤈ҅ইғܔୌӞӻᓌڠݢզ
Bash cd project_path; node www/production.js home/index/index;
ୌፓ୯ crontab ҅ਖ਼ӤᶎಗᤈᚕਂԅӞӻկනࣁᧆፓ୯ӥ̶ڠࣁᶱፓፓ୯ӥ
ਧಗᤈ
ইғ҅ۓਧಗᤈ҅᭗ᬦե crontab -e ᖫᬋਧձکۗᔮᕹ᯾ጱ crontab ݢզ؉
Bash 0 */1 * * * /bin/sh project_path/crontab/a.sh # 1 ੜಗᤈӞེ ۓአ node-crontab ཛྷࣘಗᤈਧձֵ
ইғ̶ۓक़҅Ԟݢզֵአ node-crontab ཛྷࣘಗᤈਧձۓᴻԧֵአ crontab եᤈᘶݳಗᤈਧձ
JavaScript import crontab from 'node-crontab'; // 1 ੜಗᤈӞེ let jobId = crontab.scheduleJob('0 */1 * * *', () => {
});
ᛔۖಗᤈ̶ۖސۓਖ਼ӤᶎդᎱկਂනࣁ src/common/bootstrap ፓ୯ӥ҅ᬯݢզࣁ๐
፡ӥಗᤈጱපຎ҅ݢզአᔄ֒ӥᶎጱොୗғܨሾहӥᚆᒈݎইຎ๕ࣁ
JavaScript import crontab from 'node-crontab';
let fn = () => { ᭦ᬋٍ֛ۓਧձ// } // 1 ੜಗᤈӞེ let jobId = crontab.scheduleJob('0 */1 * * *', fn); //ݎሾहӥᒈܨಗᤈӞེ፡පຎ if(think.env === 'development'){ fn(); }
ᕚӤ᮱ᗟ
դᎱᖫᦲ
ᳵᳩԧտํӞਧጱٖਂအᶂ҅ಅզᕚӤӧݢֵአᬯګሾहӥ҅դᎱտᛔۖᖫᦲ̵ᛔۖๅෛ҅֕ᬯᐿݎ ᐿොୗ̶ app/ ፓ୯̶ کಗᤈ npm run compile ե҅ਖ਼ src/ ፓ୯ᖫᦲڹᵱᥝࣁդᎱӤᕚ
ۓአ pm2 ᓕቘ๐ֵ
ੴጱොୗਞᤰ҅ইғقጱཛྷࣘ҅ᶋଉୌᦓࣁᕚӤֵአ̶ֵአ pm2 ᵱᥝզۓpm2 ฎӞྃӫӱᓕቘ Node.js ๐ sudo npm install -g pm2 ̶ਞᤰਠ౮ݸ҅եᤈӥտํ pm2 ե̶
ୌݷԅ pm2.json ጱᯈᗝկٖ҅ᔄ֒ইӥғڠୌᶱፓ҅տࣁᶱፓፓ୯ӥڠ JavaScript { "apps": [{ "name": "demo", "script": "www/production.js", "cwd": "/Users/welefen/Develop/git/thinkjs/demo", "max_memory_restart": "1G", "autorestart": true, "node_args": [], "args": [], "env": {
} }] }
ғۓ๐ސ᯿/ۖސදԅᕚӤ፥ਫጱᶱፓ᪠ஆ҅ᆐݸࣁᶱፓፓ୯ӥֵአӥᶎጱեਖ਼ cwd ᯈᗝ
Bash pm2 startOrReload pm2.json pm2 ᧇᕡጱᯈᗝ᧗ᥠ http://pm2.keymetrics.io/docs/usage/application-declaration/̶
ᵱᥝֵአեۓ๐ۖސጱᦾ҅ۓဳ ғইຎᕚӤӧֵአ pm2 ᓕቘ Node.js ๐ node www/production.js ̶
ݻդቘݍአ nginx ؉ֵ
ୌӞӻݷԅ nginx.conf ጱ nginx ᯈᗝկ̶ᯈᗝկٖᔄ֒ইӥғڠୌᶱፓ҅տࣁᶱፓፓ୯ڠ nginx server { listen 80; server_name localhost; root /Users/welefen/Develop/git/thinkjs/demo/www; set $node_port 8360;
index index.js index.html index.htm; if ( -f $request_filename/index.html ){ rewrite (.*) $1/index.html break; } if ( !-f $request_filename ){ rewrite (.*) /index.js; } location = /index.js { proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_pass http://127.0.0.1:$node_port$request_uri; proxy_redirect off; } location = /production.js { deny all; }
location = /testing.js { deny all; } location ~ /static/ { etag on; expires max; } }
දԅଫጱऒݷ҅ਖ਼ set $node_port 8360 ᯾ጱ 8360ץ ਖ਼ server_name localhost ᯾ጱ localhost ጱᒒݗӞᛘ̶ލදᶱፓ᯾ፊץ nginx ጱᯈᗝկፓ୯Ӿ҅ᆐݸ᭗ᬦ nginx -s reload ե reload ᯈ کදਠ౮ݸ҅ਖ਼ᧆᯈᗝկ೩ᨬץ ᗝ҅ᬯ੪ݢզ᭗ᬦऒݷᦢᳯԧ̶
දᯈᗝկץᯈᗝ proxy_on ҅ᬯ੪ݢզᐬྊፗള᭗ᬦ IP + ᒒݗᦢᳯ̶ސᕚӤୌᦓ src/common/config/env/production.js ҅ইғ JavaScript export default { proxy_on: true }
ᳮᶉாᩒრ॒ቘጱᯈᗝى
ThinkJS ฎඪ೮॒ቘᶉாᩒრ᧗ጱ̶֕դᎱ᮱ᗟࣁᕚӤ҅ฎአ nginx ॒ቘᶉாᩒრ᧗҅ݎԅԧො ᚆṛᚆ̶ۑᳮ ThinkJS ᯾॒ቘᶉாᩒრ᧗ጱىጱ҅ᬯݢզ
ইӥጱᯈᗝғفےݢզࣁᯈᗝկ src/common/config/env/production.js Ӿ
JavaScript export default { resource_on: false }
አ clusterֵ
̶ێቘᚆ॒ݎᚆ҅ṛଚ܋አग़໐ CPU ڥکᚆᬡۑ cluster ސᕚӤݢզ
ইӥጱᯈᗝғفےݢզࣁᯈᗝկ src/common/config/env/production.js Ӿ
JavaScript export default { cluster_on: true }
ݎൊկ
ThinkJS 2.0 ᯾ඪ೮ 2 ᐿᔄࣳጱൊկ҅Ӟᐿฎ Middleware҅ݚӞᐿฎ Adapter̶
ୌൊկڠ
ୌӞӻൊկ҅ൊկեୌᦓֵአ think- १̶ڠݢզ᭗ᬦӥᶎጱե
Bash thinkjs plugin think-xxx
ғ௳מᔄ֒ӥᶎጱکୌ think-xxx ፓ୯҅ଚݢզ፡ڠಗᤈݸ҅տᛔۖ create : think-xxx/ create : think-xxx/src create : think-xxx/src/index.js create : think-xxx/test create : think-xxx/test/index.js create : think-xxx/.eslintrc create : think-xxx/.npmignore create : think-xxx/.travis.yml create : think-xxx/package.json create : think-xxx/README.md
enter path: $ cd think-xxx/
install dependencies: $ npm install
watch compile: $ npm run watch-compile
run test: $ npm run test-cov
ፓ୯ᕮ
ݎsrc/ ਂනრդᎱֵ҅አ ES6/7 ᇙ ၥᦶፓ୯زܔ /test .eslintrc eslint ༄ັᯈᗝկ .npmignore npm ݎኼጱկ .travis.yml travis ೮ᖅᵞ౮ᯈᗝկ package.json npm ᯈᗝկ README.md ᧔กկ
ਞᤰׁᩢ
Bash npm install --verbose
ݎ
ဌํᖀಥձ֜ᔄ̶҅ڊդᎱկԅ src/index.js ҅ἕᦊኞ౮ጱկݝฎӞӻचጱᔄᬌ
ইຎฎ Middleware҅ᵱᥝᖀಥ think.middleware.base ᔄ̶ইຎฎ Adapter҅ᵱᥝᖀಥ think.adapter.base ᔄ̶ ᖫᦲ̶ܨදݸ੪տᒈץᬦᑕӾ҅ݢզࣁեᤈӥಗᤈ npm run watch-compile ҅ᬯկݎ
ၥᦶزܔ
زܔၥᦶ҅ၥᦶຝֵአጱฎ mocha҅ݢզ᭗ᬦӥᶎጱեັ፡زܔጱىࣁ test/index.js կԡٟፘ ၥᦶᕮຎ̶
Bash npm run test-cov
᧔ก
ၥᦶਠ౮ݸ҅ᵱᥝࣁ README.md ᯾ԡٟᧇᕡጱ᧔ก̶زܔݎդᎱ
ݎ
ୌݩੂᎱ҂̶ڠᬦ҅տᐏݎဌڹnpm ՙପ᯾ҁইຎԏ کཛྷࣘݎ ݢզ᭗ᬦ npm publish
ጱॹىᤒӾ҅ଚᶾݐፘڜਥොጱൊկکےਠ౮ݸ҅ݢզᘶᔮ ThinkJS-Team҅ᕪᏟᦊ෫ݸ҅ݢզႲݎ ̶ۜ
വគཛྷࣘ
ᗑᕶ᧗
superagent request
෭ப
log4js
෭๗॒ቘ
moment
ᖫᎱ۸
iconv-lite
ቘ॒؟ࢶ
gm ຝ
thinkjs express koa sails
᧣ᦶ
node-inspector
ၥᦶزܔ
mocha istanbul muk
ᓕቘۓ๐
pm2
ᮒկ
nodemailer
ۓਧձ
node-crontab
ᚆۑๅग़
ই֜ਖ਼ callback ۱ᤰ౮ Promise
ጱളݗԞฎ callback ୵ୗጱ̶֕׀ጱஉग़ളݗ᮷ฎ callback ୵ୗጱ҅ଚӬஉग़ᒫӣොପ׀Node.js ThinkJS ᵱᥝളݗฎ Promise ୵ୗጱ҅ಅզᵱᥝਖ਼ callback ୵ୗጱളݗ۱ᤰ౮ Promise̶
ԧ think.promisify ොဩݢզள᭛ਖ਼ളݗ۱ᤰԅ Promise ොୗٍ֛҅᧗ᥠᬯ᯾̶׀ThinkJS
ڜᴚۓձ
Node.js Ӟӻஉय़ጱսᅩ੪ฎྍ I/O҅ᬯ੪ݢզොጱ؉ଚᤈ॒ቘ҅ইғଚᤈ݄᧗ӞԶളݗ҅ଚᤈ݄॒ ݢᚆ੪տᛘಸᲙ̶҅ګጱ҅ইຎଚᤈ॒ቘጱහፓӧᴴګቘӞԶկ̶֢֕ᔮᕹկݙຢฎํᴴ
ԧ think.parallelLimit ොဩ॒ቘྌᔄᵱ҅׀॒ቘ҅ThinkJS ᯾ڜᴚۓӞᛱ᮷ฎ᭗ᬦձײᬯ ᥠᬯ᯾̶ٍ֛
API think
ԧय़ᰁํአጱંොဩ̶ᬯԶොဩࣁଫአጱձ֜ࣈො᮷ݢզፗളތੴ҅ᧆ᯾۱قthink ฎӞӻ አ҅෫ᵱٚ require̶ֵ
ં think.startTime
ᳵ҅ฎӻ unix ᳵ౿̶ۖސۓ๐ think.env
ਧғۖސݢզࣁᶱፓ҅ᶱፓᬩᤈጱሾह҅ἕᦊඪ೮ӥᶎ 3 ӻڹ୮
දጱկץሾह҅տᛔۖๅෛݎdevelopment testing ၥᦶሾह production ᕚӤሾह҅դᎱӤᕚֵአ think.dirname
ইӥғਧ҅ἕᦊۖސᶱፓጱկ४ݷᑍ҅ݢզࣁᶱፓ JavaScript think.dirname = { config: 'config', //ᯈᗝկፓ୯ ፓ୯ګ//ഴ 'controller', controller: model: 'model', //ཛྷࣳፓ୯ adapter: 'adapter', //ᭇᯈፓ୯ logic: 'logic', //᭦ᬋፓ୯ ፓ୯ۓ//๐ 'service', service: view: 'view', //ᥤࢶፓ୯ middleware: 'middleware', //Ӿᳵկፓ୯ runtime: 'runtime', //ᬩᤈፓ୯ common: 'common', //᭗አፓ୯ ፓ୯ۖސ// ,''bootstrap bootstrap: //ࢿ۸ፓ୯ 'locale' locale: } think.port
ኼᯈᗝկ᯾ጱᒒݗ̶ڞਧ̶ইຎਧ҅ۖސᶱፓᬩᤈጱᒒݗ҅ݢզࣁᶱፓ think.cli
ԅփ᭓ጱ݇හ҅ݢզ᭗ᬦӥᶎᧆڞฎեᤈཛྷୗࣁᬩᤈᶱፓ҅ἕᦊԅ false ̶ইຎฎեᤈཛྷୗ҅ވฎ եᤈཛྷୗ̶ۖސጱොୗ
node www/index.js /home/index/test think.lang
ጱ҅ሾहݒᰁӾݐ҅ࣁ Windows ӥݢᚆԅᑮ̶ڹᔮᕹ୮ think.mode
ጱཛྷୗ҅ຝඪ೮3Ӿᶱፓཛྷୗғڹᶱፓ୮
ཛྷࣘཛྷୗ҅ෆӻᶱፓݝํӞӻཛྷࣘܔ think.mode_mini ཛྷࣘړthink.mode_normal ग़ཛྷࣘཛྷୗ҅ፓ୯ᕮݝํ Controller ҅ View ҅ Logic ᒵ ፓ୯ᕮړښthink.mode_module ग़ཛྷࣘཛྷୗ҅Ӹ໒ೲᆙཛྷࣘ think.version
ጱᇇڹThinkJS୮ think.module ԅᑮහᕟ̶ᤒ҅ইຎᶱፓཛྷୗฎ think.mode_mini ҅ᮎԍڜᶱፓӥጱཛྷࣘڹ୮ think.THINK_PATH
ThinkJSդᎱጱ᪠ஆ think.THINKLIBPATH
ThinkJSդᎱ lib/ ጱٍ֛᪠ஆ think.ROOT_PATH
ᶱፓጱ໑ፓ୯҅ࣁ www/index.js ӾਧԎ think.APP_PATH
ᶱፓጱ app ፓ୯҅ࣁ www/index.js ӾਧԎ think.RESOURCE_PATH
ᶱፓጱᶉாᩒრ໑ፓ୯҅ࣁ www/index.js ӾਧԎ
ොဩ think.Class(methods, clean)
ጱᦾ҅ݢզፗളֵአ ES6 ᯾ጱݎୌӞӻᔄ҅ἕᦊᖀಥᛔ think.base ̶ ইຎֵአ ES6 ᇙᬰᤈڠாጱۖ ୌᔄ̶ڠclass
JavaScript //ᖀಥᛔ think.base var Cls1 = think.Class({ getName: function(){
} })
ӧᖀಥ think.base #####
JavaScript var Cls2 = think.Class({ getName: function(){
} }, true); ᖀಥӞӻᔄ
JavaScript //ᖀಥᛔ Cls2 var Cls3 = think.Class(Cls2, { init: function(name){ this.name = name; }, getName: function(){
} })
ਫֺ۸ᔄ
JavaScript ොဩ init ឴ݐᔄጱਫֺ҅ᛔۖ᧣አ// var instance = new Cls3('thinkjs'); think.extend(target, source1, source2, …)
target {Object} ፓ୯ source1 {Mixed} რ1 return {Object} ፓ୯ target Ӥ҅ᔄ֒ԭ jQuery ᯾ጱ $.extend ොဩ̶ کګਖ਼ source1, source2 ᒵӤጱંොဩ॔
̶ګݢզਖ਼ᒫӞӻ݇හփ false ᬰᤈၠଶ॔҅ګἕᦊԅႮଶ॔
JavaScript think.extend({}, {name: 'foo'}, {value: 'bar'}); // returns {name: 'foo', value: 'bar'} think.isBoolean(obj)
obj {Mixed} ᥝ༄ၥጱ return {Boolean}
̶ฎਫ਼ވ༄ၥӞӻฎ
JavaScript think.isBoolean(true); //true think.isBoolean(false); //true think.isBoolean('string'); //false think.isNumber(obj)
obj {Mixed} ᥝ༄ၥጱ return {Boolean}
༄ၥӞӻฎވฎහਁ̶
JavaScript think.isNumber(1); //true think.isNumber(1.21); //true think.isObject(obj)
obj {Mixed} ᥝ༄ၥጱ return {Boolean}
༄ၥฎވฎ
JavaScript think.isObject({}); //true think.isObject({name: "welefen"}); //true think.isObject(new Buffer('welefen')); //false think.isString(obj)
obj {Mixed} ᥝ༄ၥጱ return {Boolean}
༄ၥฎވฎਁᒧԀ
JavaScript think.isString("xxx"); // true think.isString(new String("xxx")); //true think.isFunction(obj)
obj {Mixed} ᥝ༄ၥጱ return {Boolean}
හڍฎވ༄ၥฎ
JavaScript think.isFunction(function(){}); //true think.isFunction(new Function("")); //true think.isDate(obj)
obj {Mixed} ᥝ༄ၥጱ return {Boolean}
༄ၥฎވฎ෭๗
JavaScript think.isDate(new Date()); //true think.isRegExp(obj)
obj {Mixed} ᥝ༄ၥጱ return {Boolean}
ڞฎྋވ༄ၥฎ
JavaScript think.isRegExp(/\w+/); //true think.isRegExp(new RegExp("/\\w+/")); //true think.isError(obj)
obj {Mixed} ᥝ༄ၥጱ return {Boolean}
༄ၥฎވฎӻᲙ
JavaScript think.isError(new Error("xxx")); //true think.isEmpty(obj)
obj {Mixed} ᥝ༄ၥጱ return {Boolean}
༄ၥฎވԅᑮ JavaScript // ༄ၥฎވԅᑮ think.isEmpty({}); //true think.isEmpty([]); //true think.isEmpty(""); //true think.isEmpty(0); //true think.isEmpty(null); //true think.isEmpty(undefined); //true think.isEmpty(false); //true think.isArray(obj)
obj {Mixed} ᥝ༄ၥጱ return {Boolean}
༄ၥฎވฎහᕟ
JavaScript think.isArray([]); //true think.isArray([1, 2]); //true think.isArray(new Array(10)); //true think.isIP4(obj)
obj {Mixed} ᥝ༄ၥጱ return {Boolean}
༄ၥฎވฎ IP4
JavaScript think.isIP4("10.0.0.1"); //true think.isIP4("192.168.1.1"); //true think.isIP6(obj)
obj {Mixed} ᥝ༄ၥጱ return {Boolean}
༄ၥฎވฎ IP6
JavaScript think.isIP6("2031:0000:130f:0000:0000:09c0:876a:130b"); //true think.isIP6("2031:0000:130f::09c0:876a:130b"); //true think.isIP(obj) obj {Mixed} ᥝ༄ၥጱ return {Boolean}
༄ၥฎވฎ IP
JavaScript think.isIP("10.0.0.1"); //true think.isIP("192.168.1.1"); //true think.isIP("2031:0000:130f:0000:0000:09c0:876a:130b"); //true ip6 think.isFile(file)
file {Mixed} ᥝ༄ၥጱկ᪠ஆ return {Boolean}
ᬬࢧ falseڞฎկ҅ইຎࣁӧਂࣁވ༄ၥฎ
JavaScript think.isFile("/home/welefen/a.txt"); //true think.isFile("/home/welefen/dirname"); //false think.isDir(dir)
dir {Mixed} ᥝ༄ၥጱ᪠ஆ return {Boolean}
ᬬࢧ falseڞฎፓ୯҅ইຎӧਂࣁވ༄ၥฎ
JavaScript think.isDir("/home/welefen/dirname"); //true think.isBuffer(obj)
obj {Mixed} ᥝ༄ၥጱ return {Boolean}
༄ၥฎވฎ Buffer
JavaScript think.isBuffer(new Buffer(20)); //true think.isNumberString(obj)
obj {Mixed} ᥝ༄ၥጱ return {Boolean} ฎވฎਁᒧԀᔄࣳጱහਁ
JavaScript think.isNumberString(1); //true think.isNumberString("1"); //true think.isNumberString("1.23"); //true think.isPromise(obj)
obj {Mixed} ᥝ༄ၥጱ return {Boolean}
༄ၥฎވฎӻ Promise
JavaScript think.isPromise(new Promise(function(){})); //true think.isPromise(getPromise()); //true think.isHttp(obj)
obj {Mixed} ᥝ༄ၥጱ return {Boolean}
ฎ۱ᤰጱ http ވ༄ၥฎ
JavaScript think.isHttp(http); // true think.isWritable(path) path {String} ᥝٟጱፓ୯ return {Boolean}
ᬬࢧ falseڞݢٟ҅ইຎӧਂࣁވෙկᘏፓ୯ฎڣ think.isPrevent(obj)
obj {Mixed} return {Boolean}
̶ ฎӻᴥྊᔄࣳጱ Promise̶᭗ᬦ think.prevent() տኞ౮ᧆ Promiseވෙฎڣ think.mkdir(p, mode)
ୌጱፓ୯ڠp {String} ᥝ ୌጱፓ୯ᴴ҅ἕᦊԅ 0777ڠmode {Number} ᥝ
දፓ୯ጱᴴ̶ץୌፓ୯҅ইຎፓ୯૪ᕪਂࣁ҅ᮎԍڠ᭓୭ጱ
JavaScript ӧਂࣁ /home/welefen/a/b/ ᦡ // think.mkdir("/home/welefen/a/b"); ୌৼፓ୯ڠ᭓୭ // think.mkdir("home/welefne/a/b/c/d/e"); think.rmdir(p, reserve)
ᴻጱፓ୯ڢp {String} ᥝ ᴻৼፓ୯ڢݝڞኸᧆፓ୯̶ইຎԅ true҅כވreserve {Boolean} ฎ return {Promise}
ፗളᬬࢧ̶ᬬࢧฎӻ Promise҅ݸᖅ֢ᥝࣁ then ᯾ಗᤈڞᴻፓ୯҅ইຎፓ୯ӧਂࣁڢ᭓୭ጱ
JavaScript function rmTmp(){ think.rmdir('/foo/bar').then(function(){ ݸᖅٌ՜֢// }) }
ݢզֵአ yieldڞ҅ ইຎֵአ Generator Function
JavaScript function * rmTmp(){ yield think.rmdir('/foo/bar'); ݸᖅٌ՜֢// } think.chmod(p, mode)
දጱፓ୯ץp {String} ᥝ mode {Number} ፓ୯ᴴ҅ἕᦊԅ 0777
ፗളᬬࢧڞදፓ୯ᴴ҅ইຎፓ୯ӧਂࣁץ
JavaScript think.chmod("/home/welefen/a", 0777); think.md5(str)
str {String} ᥝᦇᓒጱਁᒧԀ return {String} ᬬࢧਁᒧԀጱ md5 ᦇᓒਁᒧԀጱ md5
JavaScript think.md5('thinkjs'); // returns 7821eb623e0b1138a47db6a88c3f56bc think.camelCase(sr)
str {String} ᥝഘጱਁᒧԀ return {String}
ഘԅḧશොୗ
JavaScript think.camelCase('a_bbb_ccc'); //returns aBbbCcc think.defer()
return {Object} Deferred
ୌӞӻ Deferred ҅ new Promise ጱӞᐿளഠොୗ̶ᡱᆐӧୌᦓֵአ Deferred ᬯᐿොୗ҅֕ڠ ̶ ӧӧֵአ̶ইғ setTimeout , eventײํ
JavaScript አDeferredጱොୗֵ// var fn = function(){ var deferred = think.defer(); process.nextTick(function(){ if(xxx){ deferred.resolve(data); }else{ deferred.reject(err); } }) return deferred.promise; }
ᓌ၄̶ےአ Deferred ොୗྲፗളֵአ new Promise ጱොဩդᎱๅֵ JavaScript Promiseጱොୗ ፗളֵአnew// var fn = function(){ return new Promise(function(resolve, reject){ process.nextTick(function(){ if(xxx){ resolve(data); }else{ reject(err); } }) }) }
ဳғ ྍ callback ጱ֢ӧᥝֵአ Deferred ොୗ҅ݢզአ think.promisify ොဩள᭛ ̶ callback ۱ᤰ౮ Promise think.promisify(fn, receiver)
හڍfn {Function} ᥝ۸ጱ receiver {Object} thisݻ
හጱᒫӞӻ݇හԅڍ᧣හ҅Ӭࢧڍ᧣ਖ਼ྍොဩள᭛۱ᤰ౮ Promise҅ྍොဩᶳᒧݳ๋ݸӞӻ݇හԅࢧ ̶ڞerr ጱܻ
JavaScript var fs = require('fs');
឴ݐկٖ// var getContent = function(filePath){ ਖ਼readFileොဩ۱ᤰ౮Promise// var readFilePromise = think.promisify(fs.readFile, fs); ݐկٖ// return readFilePromise(filePath, 'utf8'); }
឴ݐٍ֛ጱկٖ// getContent('/foo/bar/file.txt').then(function(content){ console.log(content); }).catch(function(err){ console.error(err.stack); }) think.reject(err)
err {Error} Error return {Promise} reject promise
ᵱᥝ᧣አع̶௳מᲙܦᬬࢧӞӻ reject promise҅Ө Promise.reject ӧݶጱฎ҅ᧆොဩտᛔۖ ̶௳מᲙܦcatch ොဩಋૡ
JavaScript አPromise.rejectֵ// var fn = function(){ return Promise.reject(new Error('xxx')); } ௳מᲙܦᵱᥝಋૡ᧣አcatchොဩ// fn().catch(function(err){ console.error(err.stack); })
JavaScript አthink.rejectֵ// var fn = function(){ return think.reject(new Error('xxx')); } ௳מ໒ୗ۸ݸጱᲙܦտᛔۖ// fn(); think.co
ݷ https://github.com/tj/coڦco ཛྷࣘጱ think.lookClass(name, type, module, base) name {String} ᔄݷ type {String} ᔄࣳ (controller | model | logic …) module {String} ཛྷࣘݷ ತଫጱचᔄکbase {String} ತӧ
ತଫᔄࣳጱचັڞ҅کcommon ཛྷࣘӥັತ҅ইຎᬮฎತӧ کտک໑ഝᔄࣳ҅ݷᑍັತᔄ̶ইຎತӧ ᔄ̶
JavaScript //ັತ home ཛྷࣘӥ user controller controller user ཛྷࣘӥ common տತ҅کইຎತӧ// controller base տತ҅کইຎᬮฎತӧ// think.lookClass('user', 'controller', 'home');
//ັತ admin ཛྷࣘӥ user controller think.lookClass('admin/user', 'controller'); think.getPath(module, type, prefix) module {String} ཛྷࣘݷ type {String} ᔄࣳ҅ইғ controller, model, logic ᖗڹ {prefix {String
ᶱፓᔄࣳ឴ݐଫᔄࣳጱፓ୯̶ڹ໑ഝ୮
JavaScript let path = think.getPath('home', 'controller');
ጱፓ୯ԅғکᶱፓጱ໑ፓ୯ฎ /foo/bar ҅ᮎԍ឴ݐڹই୮
ᶱፓཛྷୗ think.mode_mini ӥ᪠ஆԅ /foo/bar/app/controller ᶱፓཛྷୗ think.mode_normal ӥ᪠ஆԅ /foo/bar/app/controller/home ᶱፓཛྷୗ think.mode_module ӥ᪠ஆԅ /foo/bar/app/home/controller think.require(name, flag)
name {String} flag {Boolean} think.safeRequire(file)
ጱկےfile {String} ᥝ
̶௳מᲙܦᬬࢧ null҅ଚڞӞӻկ҅ইຎկӧਂࣁ҅ےጱقਞ think.prevent()
ᬬࢧӞӻᇙྛጱ reject promise ̶ᧆ Promise ݢզᴥྊݸᖅጱᤈԅӬӧտಸᲙ̶ think.log(msg, type, showTime)
௳מ {msg {String | Error type {String} ᔄࣳ showTime {Number | Boolean} ฎވดᐏᳵ
ොັ፡ݸᖅ॒ቘ̶҅௳מጱ෭பտํᳵ҅ᔄࣳᒵڊܦ෭ப҅ᧆොဩܦ
JavaScript think.log('WebSocket Status: closed', 'THINK'); //writes '[2015-09-23 17:43:00] [THINK] WebSocket Status: closed'
௳מᲙܦ JavaScript think.log(new Error('error'), 'ERROR'); //writes '[2015-09-23 17:50:17] [Error] Error: error'
ดᐏಗᤈᳵ
JavaScript think.log('/static/module/jquery/1.9.1/jquery.js', 'HTTP', startTime); //writes '[2015-09-23 17:52:13] [HTTP] /static/module/jquery/1.9.1/jquery.js 10ms'
ӧดᐏᳵ
JavaScript think.log('/static/module/jquery/1.9.1/jquery.js', 'HTTP', null); //writes '[HTTP] /static/module/jquery/1.9.1/jquery.js'
ᛔਧԎ #####
JavaScript think.log(function(colors){ return colors.yellow('[WARNING]') + ' test'; }); //writes '[WARNING] test'
̶ Ӿ colors ԅ npm ཛྷࣘ colors҅https://github.com/Marak/colors.jsٌ think.config(name, value, data) name {String} ᯈᗝݷᑍ value {Mixed} ᯈᗝ data {Object} ᯈᗝ
ݐᘏᦡᗝᯈᗝ҅ݢզਧጱᯈᗝ̶
JavaScript ឴ݐᯈᗝ// let value = think.config('name'); ཛྷࣘӥጱᯈᗝ admin ឴ݐ// let value = think.config('name', undefined, 'admin');
ᯈᗝفٟ // think.config('name', 'value'); think.getModuleConfig(module) module {String} ཛྷࣘݷᑍ return {Object}
ཛྷࣘጱᯈᗝ҅᭗አཛྷࣘጱᯈᗝ҅ຝἕᦊጱᯈᗝ̶ތ឴ݐཛྷࣘጱಅํᯈᗝ̶ᧆᯈᗝ۱
JavaScript ཛྷࣘጱಅํᯈᗝ admin ឴ݐ// let configs = think.getModuleConfig('admin'); think.hook()
ද̶ץᘏےဳ̵ٙ឴ݐಗᤈ hook҅ᶱፓӾݢզ໑ഝᵱᥝ᭄
ᤒڜ ឴ݐԪկଫጱ middleware
JavaScript think.hook('view_template'); //returns ['locate_template']
ᦡᗝ hook
JavaScript //๊ഘܻํጱ hook think.hook('view_template', ['locate_template1']);
ے᭄ڹਖ਼ܻํጱԏ// think.hook('view_template', ['locate_template1'], 'prepend');
ےਖ਼ܻํጱԏݸ᭄// think.hook('view_template', ['locate_template1'], 'append');
ᴻ hookڢ
JavaScript think.hook('view_template', null);
ಗᤈ hook
JavaScript let result = think.hook('view_template', http, data); //result is a promise think.middleware()
ୌ̵឴ݐಗᤈ middleware̶ڠဳ̵ٙ ୌ middlewareڠ
JavaScript ᐏֺ XML ᥴຉ// var ParseXML = think.middleware({ run: function(){ var http = this.http; var payload = http.payload; //payloadԅӤփጱpostහഝ ฎᐏֺ xmlParse //ֵአӞӻxmlᥴຉ҅ᬯ᯾ xmlParse.parse(payload); = data var ឴ݐ http.post('xxx') http._post҅ݸᖅݢզ᭗ᬦ ᕳ//ਖ਼ᥴຉݸጱහഝᩙ data; = http._post } });
ୌ middleware̶ڠ አ ES6ֵ
JavaScript let Cls1 = class extends think.middleware.base { run(){ let http = this.http; } }
ဳٙ middleware
ጱ function҅Ԟݢզฎԅ॔ጱ class̶ܔmiddleware ݢզฎӻᓌ
JavaScript function ԅ middleware ဳٙ// think.middleware('parse_xml', http => {
})
JavaScript class ԅ middleware ဳٙ// ಗᤈ run տᛔۖ᧣አ// let Cls = think.middleware({ run: function(){ let http = this.http;
} }); think.middleware('parse_xml', Cls);
឴ݐ middleware
JavaScript let middleware = think.middleware('parse_xml'); ಗᤈ middleware
JavaScript let result = think.middleware('parse_xml', http); //result is a promise think.adapter()
ୌ̵ဳ̵ٙ឴ݐಗᤈ adapter̶ڠ
ୌ adapterڠ
JavaScript adapter ୌӞӻڠ// var Cls = think.adapter({
});
ᔄ base session adapter҅ᖀಥᛔ session ୌӞӻڠ// var Cls = think.adapter('session', 'base', {
})
JavaScript adapter session ୌӞӻڠ ES6 አֵ// let Cls = class extends think.adapter.session {
}
ဳٙ adapter
JavaScript adapter session ᔄࣳጱ xxx ဳٙӞӻ// think.adapter('session', 'xxx', Cls);
឴ݐ adapter
JavaScript adapter session ᔄࣳጱ file ឴ݐ// let Cls = think.adapter('session', 'file');
ಗᤈ adapter
JavaScript let Adapter = think.adapter('session', 'file'); let instance = new Adapter(options); think.gc(instance) instance {Object} ᔄጱਫֺ
̶ gcType ොဩ gcંํތӾ̶instance ᶳڜgc ᴚ کဳٙਫֺ
ොႴګԧӞॺ׀ᚆӞᛱ᮷ฎํᬦ๗ᳵ҅ᬦ๗ݸᵱᥝᥝᬰᤈႴᴻૡ̶֢ຝۑcache, session ᬯԶ ؟ ᴻᬦ๗ጱկᒵ̶
JavaScript let Cls = class extends think.adapter.cache { init(options){ super.init(options); this.gcType = 'xFileCache'; think.gc(this); } gc(){ ತᬦ๗ጱٖଚႴᴻ// } } think.http(req, res)
req {Object} request res {Object} response return {Promise}
໑ഝ req res ۱ᤰ౮ http ̶req res ݢզᛔਧԎ̶
JavaScript ҅ොեᤈӥ᧣አ http ኞ౮Ӟӻ url ໑ഝӞӻ// think.http('/index/test').then(http => {
}); think.uuid(length)
length {Number} ኞ౮ਁᒧԀጱᳩଶ҅ἕᦊԅ 32
ኞ౮ӞӻᵋਁᒧԀ̶ think.session(http)
http {Object} http
ፗളᬬࢧ̶ڞhttp Ӥ̶ইຎ૪ᕪਂࣁ҅ کኞ౮ session҅ଚٟ think.controller()
ୌ̵ಗᤈ controllerڠ
ୌ controllerڠ
JavaScript think.controller.base ᖀಥ controller, ୌڠ// let Cls = think.controller({
}) think.controller.rest ᖀಥ controller, ୌڠ// let Cls = think.controller('rest', {
})
JavaScript controller ୌڠ ES6 አֵ// let Cls1 = class extends think.controller.base {
}
ਫֺ۸ controller
JavaScript controller user ཛྷࣘӥ home ਫֺ۸// let instance = think.controller('user', http, 'home'); think.logic()
ୌ̵ಗᤈ logicڠ
ୌ logicڠ
JavaScript think.logic.base ᖀಥ logic, ୌڠ// let Cls = think.logic({
})
JavaScript logic ୌڠ ES6 አֵ// let Cls1 = class extends think.logic.base {
}
ਫֺ۸ logic JavaScript logic user ཛྷࣘӥ home ਫֺ۸// let instance = think.logic('user', http, 'home'); think.model()
ୌᘏ឴ݐ modelڠ
ୌ modelڠ
JavaScript model ୌӞӻڠ// let model = think.model({ getList: function(){
} });
//ES6 ᯾ፗളᖀಥ think.model.base ᔄ let model = class extends think.model.base { getList(){
} }
model mongo ᖀಥᛔ model ୌӞӻڠ// let model = think.model('mongo', { getList: function(){
} }); //ES6 ᯾ፗളᖀಥ think.model.mongo ᔄ let model = class extends think.model.mongo { getList(){
} }
឴ݐ model ਫֺ JavaScript let configs = { host: '127.0.0.1', name: 'user' } model user ཛྷࣘӥ home ឴ݐ// let instance = think.model('user', configs, 'home'); think.service()
ୌᘏ឴ݐ serviceڠ
##### ୌ serviceڠ
JavaScript ᔄ service ୌӞӻڠ// let service = think.service({
})
//ES6 ᯾ፗളᖀಥ think.service.base ᔄ let service = class extends think.service.base {
} service चᔄᖀಥᛔ think.base҅ಅզݢզአ think.base ᯾ጱොဩ̶
ୌ̶ڠইຎ serivce ӧమٟ౮ᔄ҅ᮎ੪ဌᥝ᭗ᬦᬯᐿොဩ
឴ݐ service
JavaScript {} service҅ଚփ᭓݇හ post ཛྷࣘӥ home ឴ݐ// ᛔۖਫֺ۸ڞฎӻᔄ҅ service ጱکইຎ឴ݐ// think.service('post', {}, 'home'); think.cache(name, value, options)
name {String} ᖨਂ key value {Mixed} ᖨਂ options {Object} ᖨਂᭌᶱ return {Promise} ֢᮷ฎᬬࢧ Promise
ᴻᖨਂ̶ڢᴻᖨਂ҅ value ฎ undefined ᤒᐏݐᖨਂ̶ value ฎ null ڢ឴ݐ̵ᦡᗝᘏ
ᖨਂӾଚᬬکᦡᗝහ҅ᆐݸਖ਼ᬬࢧڍአᧆ᧣ڞ҅کvalue ԅ Function ᤒᐏ឴ݐᖨਂ҅ইຎ឴ݐӧ ࢧ̶
JavaScript ឴ݐᖨਂ// think.cache('name').then(data => {});
᯾឴ݐᖨਂ redis ਧᖨਂᔄࣳ឴ݐ҅// think.cache('name', undefined, {type: 'redis'});
ᖨਂӾکᦡᗝᧃහഝପ҅ଚਖ਼ັڞӧਂࣁ҅ userList ইຎᖨਂ// think.cache('userList', () => { return think.model('user').select(); });
//ᦡᗝᖨਂ think.cache('name', 'value');
ᴻᖨਂڢ// think.cache('name', null); think.locale(key, …data) key {String} ᥝ឴ݐጱ key data {Array} ݇හ
ਧ̶ۖސ᭗ᬦ think.lang ොဩ឴ݐ҅ݢզࣁᔮᕹڹ୮҅໑ഝ឴ݐଫጱ
JavaScript think.locale('CONTROLLER_NOT_FOUND', 'test', '/index/test'); //returns 'controller `test` not found. url is `/index/test`.' think.validate()
ဳ̵ٙ឴ݐಗᤈ༄ၥ̶
ဳٙ༄ၥොဩ
JavaScript not_number ဳٙ༄ၥᔄࣳԅ// think.validate('not_number', value => { return !(/^\d+$/.test(value)); })
឴ݐ༄ၥොဩ JavaScript let fn = think.validate('not_number');
༄ၥහഝ
JavaScript let result = think.validate({ name: { value: 'name', required: true, not_number: true }, pwd: { value: 'xxx', required: true, minLength: 6 } }); //ইຎ result ฎ isEmpty҅ᤒᐏහഝ᮷ྋଉ if(think.isEmpty(result)){
} think.await(key, callback)
key {String} callback {Function}
̶ Ӟӻᘙጱ֢ग़ེᤩಗᤈ̶ callback ᵱᥝᬬࢧӞӻ Promiseعಗᤈᒵஇ҅
ᬯӻᬱᑕളݗጱᦢᳯ҅ݎইғአಁᦢᳯ҅ᥝ᧗Ӟӻᬱᑕጱളݗහഝ̶ইຎӧ॒ቘ҅ྯӻአಁ᧗᮷տ አӞӻᬱᑕളݗጱ᧗̶لᛘํஉय़ጱᩒრၵᩇ̶ݢզᦏᬯԶአಁ
JavaScript
import superagent from 'superagent';
export default class extends think.controller.base { * indexAction(){ let result = yield think.await('get_xxx_data', () => { let req = superagent.post('xxxx'); let fn = think.promisify(req.end, req); return fn(); }); this.success(result); } } think.npm(pkg) pkg {String} ཛྷࣘݷ
ாਞᤰཛྷ̶ࣘۖکᛔۖਞᤰ̶ᬯݢզ؉ڞཛྷ̶ࣘইຎཛྷࣘӧਂࣁ҅ے
JavaScript ᭗ᬦnpmਞᤰڞইຎmysqlཛྷࣘ҅// let mysql = think.npm('mysql');
JavaScript Ӟӻཛྷࣘےਧᇇ// let mysql = think.npm('[email protected]') think.error(err, addon)
௳מerr {Error | Promise | String} Კ ௳מጱᲙےaddon {Error | String} ᭄
ൈᬿਠෆ۸̶௳מᔮᕹጱᲙړਖ਼᮱҅௳מ໒ୗ۸Კ
JavaScript let error = think.error(new Error('xxx'));
௳מഔ឴ promise ጱᲙ
JavaScript let promise = Project.reject(new Error('xxx')); promise = think.error(promise)
̶௳מcatch҅ഔ឴Კ ےᛔۖᕳ promise ᭄ think.statusAction(status, http, log)
status {Number} ᇫாᎱ http {Object} ۱ᤰጱhttp ௳מᲙܦވlog {Boolean} ฎ
ဌᴴᒵ҂҅ดᐏଫጱᲙᶭᶎ̶҅کሿଉҁᔮᕹᲙ҅ᶭᶎತӧڊ୮ᔮᕹ
ୌᶱፓ҅տࣁ common ཛྷࣘӥኞ౮կ src/common/controller/error.js ҅ӫᳪአ॒ቘᲙఘڠ ̶٭
ἕᦊඪ೮ጱᲙᔄࣳํғ 400 , 403 , 404 , 500 , 503 ̶
දᲙᶭᶎᘏಘ̶ץᶱፓ᯾ݢզ໑ഝᵱᥝ JavaScript export default class extends think.controller.base { indexAction(){ if(xxxx){ let error = new Error('not found'); Ӥ҅አԭཛྷᇇ᯾ดᐏ http کٟ௳מਖ਼Კ// this.http.error = error; return think.statusAction(404, this.http); } } } think.parallelLimit(dataList, callback, options)
ᤒڜdataList {Array} ᥝ॒ቘጱහഝ හ҅տਖ਼ྯහഝփ᭓ᬰ݄҅ᵱᥝᬬࢧ Promiseڍcallback {Function} ॒ቘ options {Object} ᷐क़ᭌᶱ return {Promise}
Ӟӥᭌᶱғތoptions ۱
හ҅ἕᦊԅ 10 ګᴴݎlimit {Number} ଚ ӥӞӻᲙݸտ؊ྊݸᖅಗᤈ٭ኼᲙ҅ἕᦊఘވignoreError {Boolean} ฎ
ݎቘොဩ̶ইғํ 10000 ᗑᕶහഝᵱᥝ॒ቘ҅ইຎݶ॒ቘտտᗑᕶ IO Კ҅ྌݢզଚ॒ګᴴݎଚ ̶ےᧆොဩࣁ 2.0.6 ᇇӾႲ̶ګቘᬰᤈᴴ॒
Ӟӻ᧗ӥग़හഝݶ॒ቘ࣋ว JavaScript import superagent from 'superagent';
export default class extends think.controller.base { async indexAction(){ let dataList = [...]; ԅྯ॒ቘᕮຎᵞݳ result// //ইຎԶහഝ॒ቘଉ҅ᮎԍଫጱහഝԅ undefined॒҅ቘᵱᥝᬦᄁӥ let result = await think.parallelLimit(dataList, item => { let url = item.url; let req = superagent.get(url); Promise ොဩ۱ᤰ౮ end //ਖ਼ req); think.promisify(req.end, = fn let return fn(); }, { limit: 20, //Ӟེಗᤈ 20 ignoreError: true }) } }
ܔහഝࣁग़ӻ᧗ӥ॒ቘ࣋ว
ቘྲᘙ҅ইຎݶ᧗உग़ጱᦾݢᚆտᛘಸེ॒ܔӥݝአ॒ቘӞེ҅֕٭Զහഝ॒ቘᡱࣁӞӻఘํ ᬰᤈᒵஇ̶ڞݶ॒ቘහፓग़҅ݸᖅ᧗ڹইຎ୮҅ګԞᥝᬰᤈᴴײᲙ̶ᬯӻ
ᕟ҅ইғړۓӞӻፘݶጱ key ਖ਼ձفᬯӻᵱݢզ᭗ᬦփ
JavaScript import gm from 'gm';
export default class extends think.controller.base { async indexAction(){ let result = await think.parallelLimit('clip_image', () => { let imageFile = this.file('image').path; let instance = gm(imageFile).resize(240, 240).noProfile(); let fn = think.promisify(instance.write, instance); return fn('/path/to/save/image.png'); }, { limit: 20 //Ӟེಗᤈ 20 }) } }
ᔄ think.base think.base ᧇᕡՕᕨ᧗ᥠ ᬯ᯾ think.http.base think.http.base ᧇᕡՕᕨ᧗ᥠ ᬯ᯾ think.base
ԧӞԶचጱොဩ̶׀think.base ฎचᔄ҅ಅํጱᔄ᮷տᖀಥᧆᔄ҅ᧆᔄ
አ ES6 ဩᖀಥᧆᔄғֵ
JavaScript export default class extends think.base { /** * init method * @return {} [] */ init(){
} }
ত۸ጱӞԶ֢නࣁ init ොဩ᯾҅ᧆොဩࣁᔄਫڡဳ ғ ֵአ ES6 ᯾ጱᔄӧᥝٟ constructor ҅ ̶ ֺ۸ᛔۖᤩ᧣አ҅පຎᒵݶԭ constructor
አฦ᭗ጱොୗᖀಥᧆᔄғֵ
JavaScript module.exports = think.Class(think.base, { /** * init method * @return {} [] */ init: function(){
} }) init(…args)
args {Array}
ᒵ̶֢ত۸ොဩ҅ᬯ᯾ݢզᬰᤈӞԶᩙڡ JavaScript class a extends think.base { init(name, value){ this.name = name; this.value = value; } }
ဳ ғӨ 1.x ᇇӧݶጱฎ҅ 2.x ᇇ init ොဩӧٚඪ೮ᬬࢧӞӻ Promise ҅ӞԶ᭗አ֢නࣁ __before ṹොဩ᯾ᬰᤈ̶
__before()
ጭ୯ވᗝṹොဩ҅ݢզਖ਼ӞԶ᭗አጱᤈԅනࣁᬯ᯾ᬰᤈ҅ইғcontroller ᯾༄ၥአಁฎڹ
JavaScript export default class think.controller.base { /** ᗝṹොဩڹ * * @return {Promise} [] */ * __before(){ let userInfo = yield this.session('userInfo'); ጭ୯ᶭᶎک᪡ڞইຎဌํጭ୯҅// if(think.isEmpty(userInfo)){ return this.redirect('/logic'); } this.assign('userInfo', userInfo) } }
__after()
ݸᗝṹොဩ҅ࣁොဩಗᤈਠ౮ݸࣁಗᤈ̶
filename()
ᔄկጱݷᑍڹreturn {String} ᬬࢧ୮
կٍ֛᪠ஆಘݷ̶ތᔄկጱݷᑍ҅ӧ۱ڹ឴ݐ୮ JavaScript /home/xxx/project/app/controller/user.js ᔄկٍ֛᪠ஆԅڹᦡ୮// class a extends think.base { test(){ var filename = this.filename(); //returns 'user' } } invoke(method, …data) method {String} ᥝ᧣አጱොဩݷᑍ data {Array} փ᭓ጱ݇හ return {Promise}
ᬬࢧ Promise ҅ᧆොވአӞӻොဩ҅ᛔۖ᧣አ __before __after ṹොဩ̶ӧᓕොဩฎ᧣ ဩতᕣᬬࢧ Promise ̶
ොဩඪ೮ฎ */yield async/await ̶
JavaScript async/await አֵ// class Cls extends think.base { async getValue(){ let value = await this.getValue(); return value; } } let instance = new Cls(); instance.invoke('getValue').then(data => {
});
JavaScript */yield አֵ// class Cls extends think.base { * getValue(){ let value = yield this.getValue(); return value; } } let instance = new Cls(); instance.invoke('getValue').then(data => {
}); think.http.base
think.http.base ᖀಥᛔ think.base ᔄ҅ᧆᔄԅތํ http ॒ቘጱचᔄ̶middleware, controller, view ᔄ᮷ᖀಥᛔᧆᔄ̶
አ ES6 ဩᖀಥᧆᔄֵ
JavaScript export default class extends think.http.base { /** constructor ত۸ොဩ҅ਫֺ۸ᛔۖᤩ᧣አ҅ӧᥝٟڡ * * @return {} */ init(){
} }
አฦ᭗ጱොୗᖀಥᧆᔄֵ
JavaScript module.exports = think.Class(think.http.base, { init: function(){
} });
ં http
ጱંොဩ᧗ᥠ API -> http̶ތᤰጱ http ҅۱
ොဩ config(name, value) name {String} ᯈᗝݷᑍ value {Mixed} ᯈᗝ
ԅᦡᗝᯈᗝ̶ڞވݐᘏᦡᗝᯈᗝ҅value ԅ undefined ԅݐᯈᗝ҅
ጱᯈᗝ҅Ԟݢզݐᶱፓ᯾ਧԎጱᯈᗝ̶ᧆොဩӧՐݢզݐᔮᕹᶼᦡ
֢ԅᯈᗝᦡᗝ҅տᤩٌ՜አಁᕳ٫ധ̶௳מ᧗ጱአಁڹဳ ғӧݢਖ਼୮ JavaScript export default class extends think.controller.base { indexAction(){ ឴ݐᯈᗝ// let value = this.config('name'); } } action(controller, action) controller {Object | String} controllerਫֺ action {String} actionݷᑍ return {Promise}
አ controller ӥጱ action҅ᬬࢧӞӻ Promise̶ᛔۖ᧣አ __before __after ṹොဩ̶᧣
ᛔ݄ۖತଫጱ controller̶ڞইຎ controller ฎਁᒧԀ҅
JavaScript ཛྷࣘӥcontroller᯾ጱactionڹአ୮᧣// export default class extends think.controller.base { * indexAction(){ //᧣አuser controllerӥጱdetailොဩ let value = yield this.action('user', 'detail'); } }
JavaScript //ཛྷࣘ᧣አcontroller᯾ጱaction export default class extends think.controller.base { * indexAction(){ //᧣አadminཛྷࣘuser controllerӥጱdetailොဩ let value = yield this.action('admin/user', 'detail'); } } cache(name, value, options) name {String} ᖨਂݷᑍ value {Mixed | Function} ᖨਂ options {Object} ᖨਂᯈᗝٍ֛҅ᥠᖨਂᯈᗝ
̶ ԅᦡᗝᖨਂ̶ἕᦊᖨਂᔄࣳԅ fileڞވݐᘏᦡᗝᖨਂ҅ value ԅ undefined ฎݐᖨਂ҅ JavaScript export default class extends think.controller.base { * indexAction(){ ឴ݐᖨਂ// let value = yield this.cache('name'); } }
ᦡᗝᖨਂአᧆ function҅ਖ਼ᬬࢧ᧣ڞӧਂࣁ҅୮݇හ value ԅ function ҅ᤒᐏ឴ݐᖨਂ҅ইຎᖨਂ ᆐݸᦡᗝᖨਂጱἋᅸ̶ࣈොݐىࣁ҅ᆐݸٚፘਂވෙᖨਂฎڣضᥝݎࣁᶱፓعଚᬬࢧ̶ᬯ
JavaScript export default class extends think.controller.base { * indexAction(){ function҅ଚᦡᗝᖨਂ ឴ݐᖨਂ҅ᖨਂӧਂࣁᛔۖ᧣አ// let value = yield this.cache('name', () => { return this.model('user').select(); }); } }
දᖨਂᔄࣳғץᦡᗝᖨਂଚ
JavaScript export default class extends think.controller.base { * indexAction(){ ᦡᗝᖨਂ҅ᖨਂᔄֵࣳአredis// yield this.cache('name', 'value', { type: 'redis' }); } } hook(event, data) event {String} Ԫկݷᑍ data {Mixed} ݇හ return {Promise}
ᝑଗӻ middleware҅տೲᶲଧಗᤈᬯԶ middleware̶ތಗᤈଫጱԪկ҅ӞӻԪկ۱
Ԫկݢզࣁᯈᗝ src/common/config/hook.js ᯾ਧԎ҅Ԟݢզ᭗ᬦ think.hook ဳ̶ٙ JavaScript export default class extends think.controller.base { * indexAction(){ let result = yield this.hook('parse_data'); } } model(name, options) name {String} ཛྷࣳݷᑍ options {Object} ᯈᗝٍ֛҅ᥠහഝପᯈᗝ return {Object} modelਫֺ
ཛྷࣘӥଫཛྷࣳጱਫֺ҅Ԟݢզཛྷࣘ឴ݐཛྷࣳጱਫ̶ֺڹ឴ݐཛྷࣳਫֺ҅ἕᦊ឴ݐ୮
JavaScript export default class extends think.controller.base { indexAction(){ ጱਫֺ model user ཛྷࣘӥጱڹ឴ݐ୮// let model = this.model('user'); ጱਫֺ model article ឴ݐadminཛྷࣘӥ// let model1 = this.model('admin/article'); ጱහഝପ sqlite ጱਫֺ҅ଚӬฎ model test ཛྷࣘӥጱڹ឴ݐ୮// let model2 = this.model('test', { type: 'sqlite' //ᦡᗝහഝପᔄࣳԅsqlite҅ๅग़݇හᥠහഝପᯈᗝ }) } } controller(name) name {String} controllerݷᑍ return {Object} controllerਫֺ
ಸᲙ̶ڞ҅ک឴ݐ Controller ጱਫֺ҅ইຎ Controller ತӧ
JavaScript export default class extends think.controller.base { indexAction(){ ጱਫֺ controller user ཛྷࣘӥڹ឴ݐ୮// let controller = this.controller('user'); ጱਫֺ controller user ឴ݐadminཛྷࣘӥ// let controller1 = this.controller('admin/user'); } } service(name) name {String} service ݷᑍ return {Class}
឴ݐଫጱ service̶service ᬬࢧጱݢᚆฎ class ҅Ԟݢᚆፗളฎӻ҅ಅզӧտፗളਫֺ۸̶
JavaScript export default class extends think.controller.base { indexAction(){ ឴ݐଫጱservice// let service = this.service('user'); ឴ݐserviceጱਫֺ// let instance = new service(...args); service ឴ݐadminཛྷࣘӥጱuser// let service1 = this.service('admin/user'); } } http
ᬯ᯾ጱ http ଚӧฎ Node.js ᯾ጱ http ཛྷࣘ҅ᘒฎ request response ۱ᤰݸӞӻෛጱ̶
JavaScript var http = require('http');
http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World\n'); }).listen(8124);
හ̶ԅԧݸᖅ᧣አڍ᧣҅տփ᭓ request response 2ӻᕳࢧۓୌ๐ڠ ইӤᶎጱդᎱಅᐏ҅Node.js உग़ํአጱොဩ̶׀ො҅ ThinkJS ᬯ2ӻᬰᤈԧ۱ᤰ҅۱ᤰ౮ԧ http ҅ଚӬ http տࣁ middleware, logic, controller, view Ӿփ᭓̶
ಗᤈ̶ލဳ ғhttp ฎ EventEmitter ጱӞӻਫֺ҅ಅզݢզٌᬰᤈԪկፊ
ં http.req
ᔮᕹܻኞጱ request http.res ᔮᕹܻኞጱ response http.startTime
᧗ጱতᳵ҅ฎӻ unix ᳵ౿̶ http.url
̶ ᧗ጱ urlڹ୮ http.version
᧗ጱ http ᇇ̶ڹ୮ http.method
᧗ጱᔄ̶ࣳڹ୮ http.headers
̶௳מ᧗ጱಅํ१ڹ୮ http.pathname
ݢᚆکտࣁݸᖅጱ॒ቘӾٌᬰᤈදݒ̶ಅզࣁ action ೭҅տׁᩢᧆڦ᧗ጱ pathname҅᪠ኧᦩڹ୮ ӧӞᛘ̶ጱڊতᥴຉڡ᪙ http.query
᧗ጱಅํ query හഝ̶ڹ୮ http.host
ᒒݗ̶ތ᧗ጱ host҅ ۱ڹ୮ http.hostname
ᒒݗ̶ތ᧗ጱ hostname҅ӧ۱ڹ୮ http.payload
̶ᧆํތ᧗ጱ payload හഝ҅Իࣳጱ᧗ڹ୮ http._payloadParsed ૪ᕪᥴຉ̶ވ᧗ጱ payload හഝฎڹᤒᐏ୮ http._get
̶න GET ݇හਂ http._post
න POST ݇හਂ http._file
ਂනӤփጱկහഝ http._cookie
ਂන cookie හഝ̶ http.module
᧗ᥴຉݸଫጱཛྷࣘݷ̶ڹ୮ http.controller
ݷ̶ګ᧗ᥴຉݸଫጱഴڹ୮ http.action
᧗ᥴຉݸଫጱ֢ݷ̶ڹ୮
ොဩ http.config(name) name {String} ݇හݷ return {Mixed} ᬬࢧଫጱ݇හ
̶᧗ӥଫጱ݇හڹ឴ݐ୮ http.referrer()
return {String} ᧗ጱ referrer
᧗ጱ referrer̶ڹᬬࢧ୮ http.userAgent()
return {String} ᧗ጱ userAgent
᧗ጱ userAgent̶ڹᬬࢧ୮ http.isGet()
return {Boolean}
ฎ GET ᧗̶ވ᧗ฎڹᬬࢧ୮ http.isPost()
return {Boolean}
ฎ POST ᧗̶ވ᧗ฎڹᬬࢧ୮ http.isAjax(method)
method {String} ᧗ᔄࣳ return {Boolean}
ฎ Ajax ᧗̶ވ᧗ฎڹᬬࢧ୮
JavaScript ฎAjax᧗ވෙฎڣ// ;()http.isAjax ฎAjax᧗҅Ӭ᧗ᔄࣳฎGETވෙฎڣ// ;('http.isAjax('GET http.isJsonp(name) name {String} callback ݇හݷᑍ҅ἕᦊԅ callback return {Boolean}
ฎ jsonp ᧗̶ވ᧗ฎڹᬬࢧ୮
JavaScript //url is /index/test?callback=testxxx http.isJsonp(); //true http.isJsonp('cb'); //false http.get(name, value) name {String} ݇හݷᑍ value {Mixed} ݇හ ොݸᖅጱ᭦ᬋ᯾឴ݐ̶҅ݢզ᭗ᬦᧆොဩᦡᗝ GET ݇හ̶឴ݐᘏᦡᗝ GET ݇හ
JavaScript // url is /index/test?name=thinkjs http.get('name'); // returns 'thinkjs' http.get('name', 'other value'); http.get('name'); // returns 'other value' http.post(name, value) name {String} ݇හݷᑍ value {Mixed} ݇හ
ොݸᖅጱ᭦ᬋ᯾឴ݐ̶҅ ݢզ᭗ᬦᧆොဩᦡᗝ POST̶ ឴ݐᘏᦡᗝ POST
JavaScript //឴ݐԻጱemail http.post('email'); http.param(name) name {String} ݇හݷᑍ return {Mixed}
URL ݇හ᯾឴ݐ̶ڞԅᑮ҅ POST ᯾឴ݐ҅ইຎضս҅឴ݐ݇හ http.file(name) name {String} կଫጱਁྦྷݷᑍ return {Object}
឴ݐӤփጱկ̶
JavaScript http.file('image'); //returns { ᯾ጱਁྦྷݷܔ//ᤒ 'image', fieldName: //ܻতկݷ filename, originalFilename: path: filepath, //կԁਂනጱ᪠ஆ size: size //կय़ੜ } http.header(name, value) name {String} header ݷᑍ value {String} header ̶௳מ ឴ݐᘏᦡᗝ header
JavaScript //឴ݐaccept http.header('accept'); http.header('X-NAME', 'thinkjs'); //ᦡᗝheader http.expires(time)
ԅᑁ֖ܔtime {Number} ᬦ๗ᳵ҅
̶௳מ୩ᖨਂ҅ᦡᗝ Cache-Control Expires १
JavaScript http.header(86400); //ᦡᗝᬦ๗ᳵԅ 1 ॠ̶ http.status(status)
෫ဩᦡᗝᇫாᎱ̶ڞᭆ҅ݎ૪ᕪ௳מᦡᗝᇫாᎱ̶ইຎ१
JavaScript http.status(400); //ᦡᗝᇫாᎱԅ400 http.ip()
̶ٵݢᚆӧ឴ݐአಁጱ ip ̶ইຎֵአԧդቘ҅឴ݐጱ http.lang(lang, asViewPath)
lang {String} ᥝᦡᗝጱ Ӟ੶ཛྷᇇፓ୯ےႲވasViewPath {Boolean} ฎ
឴ݐᘏᦡᗝࢵᴬ۸ጱ҅ݢզඪ೮ཛྷᇇ᪠ஆᥝग़Ӟ੶ጱፓ୯̶
឴ݐ
JavaScript let lang = http.lang();
឴ݐጱଧԅ http._lang -> cookie Ӿ឴ݐ -> header Ӿ឴ݐ ҅ইຎᵱᥝ url Ӿᥴຉ http._lang Ӿ̶ંک҅ݢզ឴ݐݸ᭗ᬦ http.lang(lang) ොဩᦡᗝ
ᦡᗝ JavaScript let lang = getFromUrl(); Ӟ੶ፓ୯ے//ᦡᗝ҅ଚਧཛྷᇇ᪠ஆӾႲ true); http.lang(lang, http.theme(theme)
឴ݐᘏᦡᗝԆ᷌҅ᦡᗝݸཛྷᇇ᪠ஆᥝग़Ӟ੶Ԇ᷌ጱፓ୯̶ http.cookie(name, value) name {String} cookie ݷᑍ value {String} cookie
̶ ݐᘏᦡᗝ cookie
JavaScript cookie ጱ think_test //឴ݐݷԅ http.cookie('think_test'); ᦡᗝ෫පڞᭆݎ૪ᕪ௳מcookie҅ইຎ१ //ᦡᗝ 'value'); http.cookie('name', cookie ᴻڢ// ;(null http.cookie('name', http.session(name, value) name {String} session ݷ value {Mixed} session return {Promise}
ݐ̵ᦡᗝႴᴻ session̶
ݐ Session
JavaScript let value = yield http.session('userInfo');
ᦡᗝ Session
JavaScript yield http.session('userInfo', data);
Ⴔᴻ Session
JavaScript yield http.session(); http.redirect(url, status) url {String} ᥝ᪡ጱ url status {Number} ᇫாᎱ҅ 301 ᘏ 302҅ἕᦊԅ302
ᶭᶎ᪡̶
JavaScript ጭ୯ᶭᶎک//᪡ http.redirect('/login'); http.type(contentType, encoding)
contentType {String} ᥝᦡᗝጱ contentType encoding {String} ᥝᦡᗝጱᖫᎱ
឴ݐᘏᦡᗝ Content-Type̶
JavaScript //឴ݐContent-Type http.type(); Ӥcharsetے//ᦡᗝContent-Type҅տᛔۖ http.type('text/html'); charsetے//ᦡᗝContent-Type҅ӧ᭄ false); http.type('audio/mpeg', http.write(content, encoding)
ጱٖڊcontent {Mixed} ᥝᬌ encoding {String} ᖫᎱ
᧗̶ڹ҅ᥝ᧣አ http.end ᚆᕮ୮ٖڊᬌ http.end(content, encoding)
ጱٖڊcontent {Mixed} ᥝᬌ encoding {String} ᖫᎱ
᧗̶ڹଚᕮ୮ٖڊᬌ http.success(data, message)
ጱහഝڊdata {Mixed} ᥝᬌ ጱmessageےmessage {String} ᭄
̶ڊݸᬌۑӞӻྋଉጱහഝ҅Ӟᛱฎ֢౮ڊ໒ୗ۸ᬌ JavaScript http.success({name: 'thinkjs'}); //writes { errno: 0, errmsg: '', data: { name: 'thinkjs' } }
ྋଉ̶ވ᧗ฎڹෙ୮ڣԅ 0 ԅވᬯਮಁᒒ੪ݢզ໑ഝ errno ฎ http.fail(errno, errmsg, data) errno {Number} Კݩ ௳מerrmsg {String} Კ data {Mixed} ᷐क़ጱහഝ
̶ڊӞӻଉጱහഝ҅Ӟᛱฎ֢०ᨳݸᬌڊ໒ୗ۸ᬌ
ද̶ץဳ ғਁྦྷݷ errno errmsg ݢզࣁᯈᗝ᯾ᬰᤈ
JavaScript http.fail(100, 'fail') //writes { errno: 100, errmsg: 'fail', data: '' }
ᆐݸ໑ഝᵱᥝดᐏԧ̶҅௳מጱᲙݩᲙٍ֛کᬯਮಁᒒ੪ݢզ೭
ද̶ץဳ ғਁྦྷݷ errno errmsg ݢզࣁᯈᗝ᯾ᬰᤈ http.json(data)
data {Object}
ଫጱᯈᗝහഝ҅տᦡᗝ Content-Type ԅ application/json ҅ᧆڊjson ොୗᬌ ԅ json_content_type ̶ controller
ᵱᥝᖀಥᧆᔄ̶ګthink.controller.base ᖀಥᛔ think.http.base ᔄ̶ᶱፓ᯾ጱഴ አ ES6 ጱဩᖀಥᧆᔄֵ
JavaScript export default class extends think.controller.base { indexAction(){
} }
##### አฦ᭗ොୗᖀಥᧆᔄֵ
JavaScript module.exports = think.controller({ indexAction(){
} })
ં controller.http
փ᭓ᬰጱ http ̶
ොဩ controller.ip()
return {String}
᧗አಁጱ ip҅ᒵݶӨ http.ip ොဩ̶ڹ឴ݐ୮
JavaScript export default class extends think.controller.base { indexAction(){ let ip = this.ip(); } } controller.method()
return {String}
᧗ጱᔄࣳ҅۸ԅੜ̶ٟڹ឴ݐ୮ JavaScript export default class extends think.controller.base { indexAction(){ let method = this.method(); //get or post ... } } controller.isMethod(method)
method {String} ᔄࣳ return {Boolean}
ฎਧጱᔄ̶ࣳވጱ᧗ᔄࣳฎڹෙ୮ڣ controller.isGet()
return {Boolean}
ฎ GET ᧗̶ވෙฎڣ controller.isPost()
return {Boolean}
ฎ POST ᧗̶ވෙฎڣ controller.isAjax(method)
method {String} return {Boolean}
ฎ Ajax ᧗̶ইຎਧԧ method҅ᮎԍ᧗ᔄࣳԞᥝፘݶ̶ވෙฎڣ
JavaScript export default class extends think.controller.base { indexAction(){ //ฎajax Ӭ᧗ᔄࣳฎ POST let isAjax = this.isAjax('post'); } } controller.isWebSocket()
return {Boolean}
ฎވฎ websocket ᧗̶ controller.isCli()
return {Boolean}
ฎވฎեᤈӥ᧣አ̶ controller.isJsonp(callback) callback {String} callback ݷᑍ return {Boolean}
ฎވฎ jsonp ᧗̶ controller.get(name) name {String} ݇හݷ
̶឴ݐ GET ݇හ
JavaScript export default class extends think.controller.base { indexAction(){ ឴ݐӞӻ݇හ// let value = this.get('xxx'); ឴ݐಅํጱ݇හ// let values = this.get(); } } controller.post(name) name {String} ݇හݷ
឴ݐ POST Իጱ݇හ̶
JavaScript export default class extends think.controller.base { indexAction(){ ឴ݐӞӻ݇හ// let value = this.post('xxx'); ݇හ POST ឴ݐಅํጱ// let values = this.post(); } } controller.param(name) name {String} ݇හݷ
ٚ GET ᯾឴ݐ̶ک POST ᯾឴ݐ҅ইຎݐӧضս҅឴ݐ݇හ controller.file(name) name {String} Ӥփկଫጱਁྦྷݷ
ӥᶎጱંғތฎӻ҅۱឴ݐӤփጱկ҅ᬬࢧ
JavaScript { ݷᑍྦྷਁܔ//ᤒ 'file', fieldName: //ܻতጱկݷ filename, originalFilename: ᴻڢ᧗ᕮտᤩڞވᶱፓ᯾ጱፓ୯҅کጱԁ᪠ஆֵ҅አᵱᥝਖ਼ٌᑏۖਂכ//կ filepath, path: size: 1000 //կय़ੜ }
̶ {} ԅӞӻᑮইຎկӧਂࣁ҅ᮎԍ controller.header(name, value) name {String} header ݷ value {String} header
឴ݐᘏᦡᗝ header̶
JavaScript export default class extends think.controller.base { indexAction(){ header //឴ݐ this.header('accept'); = accept let this.header('X-NAME', 'thinks'); //ᦡᗝ header } } controller.expires(time)
ԅᑁ֖ܔtime {Number} ᬦ๗ᳵ҅
̶௳מ୩ᖨਂ҅ᦡᗝ Cache-Control Expires १ JavaScript export default class extends think.controller.base { indexAction(){ this.expires(86400); //ᦡᗝᬦ๗ᳵԅ 1 ॠ̶ } } controller.userAgent()
឴ݐ userAgent̶ controller.referrer(onlyHost)
ݝᵱᥝ hostވreferrer {Boolean} ฎ
឴ݐ referrer̶ controller.cookie(name, value, options) name {String} cookie ݷ value {String} cookie options {Object}
ᴻ cookie̶ڢ឴ݐ̵ᦡᗝᘏ
JavaScript export default class extends think.controller.base { indexAction(){ cookie ឴ݐ// let value = this.cookie('think_name'); } }
JavaScript export default class extends think.controller.base { indexAction(){ cookie ᦡᗝ// this.cookie('think_name', value, { timeout: 3600 * 24 * 7 //ํප๗ԅӞޮ }); } } JavaScript export default class extends think.controller.base { indexAction(){ cookie ᴻڢ// this.cookie('think_name', null); } } controller.session(name, value) name {String} session ݷ value {Mixed} session return {Promise}
ݐ̵ᦡᗝႴᴻ session̶
ݐ Session
JavaScript export default class extends think.controller.base { * indexAction(){ ឴ݐsession// let value = yield this.session('userInfo'); } }
ᦡᗝ Session
JavaScript export default class extends think.controller.base { * indexAction(){ //ᦡᗝ session yield this.session('userInfo', data); } }
Ⴔᴻ Session
JavaScript export default class extends think.controller.base { * indexAction(){ session አಁጱڹႴᴻ୮// yield this.session(); } } controller.lang(lang, asViewPath)
lang {String} ᥝᦡᗝጱ Ӟ੶ፓ୯ےࣁཛྷᇇፓ୯ႲވasViewPath {Boolean} ฎ
ݐᘏᦡᗝ̶ controller.locale(key)
key {String}
໑ഝ language ឴ݐଫጱ̶ controller.redirect(url, statusCode)
url {String} ᥝ᪡ጱ url statusCode {Number} ᇫாᎱ҅ἕᦊԅ 302
ᶭᶎ᪡̶ controller.assign(name, value) name {String | Object} ݒᰁݷ value {Mixed} ݒᰁ
ཛྷᇇӾ̶کਖ਼ݒᰁᩙ
JavaScript export default class extends think.controller.base { indexAction(){ ӻᩙܔ// this.assign('title', 'thinkjs'); ಢᰁᩙ// this.assign({ name: 'xxx', desc: 'yyy' }) } } controller.fetch(templateFile)
templateFile {String} ཛྷᇇկࣈ࣎ return {Promise}
឴ݐᥴຉݸጱཛྷᇇ̶ٖ ##### ፗള឴ݐ
JavaScript /foo/bar/app/home/controller/index.js ᦡկ᪠ஆԅ // export default class extends think.controller.base { * indexAction(){ // home/index_index.html let content = yield this.fetch(); } }
##### දݒ action
JavaScript /foo/bar/app/home/controller/index.js ᦡկ᪠ஆԅ // export default class extends think.controller.base { * indexAction(){ // home/index_detail.html let content = yield this.fetch('detail'); } }
##### දݒ controller action
JavaScript /foo/bar/app/home/controller/index.js ᦡկ᪠ஆԅ // export default class extends think.controller.base { * indexAction(){ // home/user_detail.html let content = yield this.fetch('user/detail'); } }
##### දݒ module, controller action
JavaScript /foo/bar/app/home/controller/index.js ᦡկ᪠ஆԅ // export default class extends think.controller.base { * indexAction(){ // admin/user_detail.html let content = yield this.fetch('admin/user/detail'); } }
##### දݒկݸᖗݷ JavaScript /foo/bar/app/home/controller/index.js ᦡկ᪠ஆԅ // export default class extends think.controller.base { * indexAction(){ // home/index_detail.xml let content = yield this.fetch('detail.xml'); } }
##### ឴ݐᕷ᪠ஆկ
JavaScript /foo/bar/app/home/controller/index.js ᦡկ᪠ஆԅ // export default class extends think.controller.base { * indexAction(){ // /home/xxx/aaa/bbb/c.html let content = yield this.fetch('/home/xxx/aaa/bbb/c.html'); } } controller.display(templateFile)
templateFile {String} ཛྷᇇկ᪠ஆ
ၨᥦᒒ̶ັತཛྷᇇկᒽኼ controller.fetch ፘݶ̶کཛྷᇇٖڊᬌ controller.jsonp(data)
ጱٖڊdata {Mixed} ᥝᬌ
̶ڊᬦᄁݸᬌق҅឴ݐ callback ݷᑍਞٖڊjsonp ጱොဩᬌ
JavaScript export default class extends think.controller.base { indexAction(){ this.jsonp({name: 'thinkjs'}); //writes 'callback_fn_name({name: "thinkjs"})' } } controller.json(data)
ጱٖڊdata {Mixed} ᥝᬌ
̶ٖڊjson ጱොୗᬌ controller.status(status)
status {Number} ᇫாᎱ҅ἕᦊԅ 404
ᦡᗝᇫாᎱ̶ controller.deny(status)
status {String} ᇫாᎱ҅ἕᦊԅ 403
᧗̶ڹᕷ୮ controller.write(data, encoding)
ጱٖڊdata {mixed} ᥝᬌ encoding {String} ᖫᎱ
ٖڊᬌ controller.end(data, encoding)
ጱٖڊdata {mixed} ᥝᬌ encoding {String} ᖫᎱ
᧗̶ڹݸᕮ୮ٖڊᬌ controller.type(type, charset)
type {String} Content-Type charset ےᛔ᭄ۖވcharset {Boolean} ฎ
ᦡᗝ Content-Type̶ controller.download(filePath, contentType, fileName) filePath {String} ӥկጱٍ֛᪠ஆ content-Type {String} Content-Type ጱկݷਂכ {fileName {String
ӥկ̶ JavaScript export default class extends think.controller.base { indexAction(){ let filePath = think.RESOUCE_PATH + '/a.txt'; a.txt ጱկݷԅਂכContent-Type҅ ڦᛔۖᦩ// this.download(filePath); } }
JavaScript export default class extends think.controller.base { indexAction(){ let filePath = think.RESOUCE_PATH + '/a.log'; b.txt ጱկݷԅਂכContent-Type҅ ڦᛔۖᦩ// this.download(filePath, 'b.txt'); } }
JavaScript export default class extends think.controller.base { indexAction(){ let filePath = think.RESOUCE_PATH + '/a.log'; b.txt ጱկݷԅਂכtext/html҅ ԅ Content-Type ਧ// this.download(filePath, 'text/html', 'b.txt'); } } controller.success(data, message)
ጱහഝڊdata {Mixed} ᥝᬌ ጱmessageےmessage {String} ᭄
̶ڊݸᬌۑӞӻྋଉጱහഝ҅Ӟᛱฎ֢౮ڊ໒ୗ۸ᬌ
JavaScript http.success({name: 'thinkjs'}); //writes { errno: 0, errmsg: '', data: { name: 'thinkjs' } }
ྋଉ̶ވ᧗ฎڹෙ୮ڣԅ 0 ԅވᬯਮಁᒒ੪ݢզ໑ഝ errno ฎ controller.fail(errno, errmsg, data) errno {Number} Კݩ ௳מerrmsg {String} Კ data {Mixed} ᷐क़ጱහഝ
̶ڊӞӻଉጱහഝ҅Ӟᛱฎ֢०ᨳݸᬌڊ໒ୗ۸ᬌ
ද̶ץဳ ғਁྦྷݷ errno errmsg ݢզࣁᯈᗝ᯾ᬰᤈ
JavaScript http.fail(100, 'fail') //writes { errno: 100, errmsg: 'fail', data: '' }
ᆐݸ໑ഝᵱᥝดᐏԧ̶҅௳מጱᲙݩᲙٍ֛کᬯਮಁᒒ੪ݢզ೭
ද̶ץဳ ғਁྦྷݷ errno errmsg ݢզࣁᯈᗝ᯾ᬰᤈ controller.sendTime(name)
name {String} header key
̶ڊݎᭆ᧗ጱಗᤈᳵֵ҅አ header ጱොୗݎ rest controller think.controller.rest ᖀಥᛔ think.controller.base҅አ॒ቘ Rest ളݗ̶
አ ES6 ጱဩᖀಥᧆᔄֵ
JavaScript export default class extends think.controller.rest {
}
አฦ᭗ොୗᖀಥᧆᔄֵ
JavaScript module.exports = think.controller('rest', {
}) ં controller._isRest
ຽᦩྌ controller ଫጱฎ Rest ളݗ̶ইຎࣁ init ොဩ᯾ਖ਼ᧆંᦡᗝԅ false ҅ᮎԍᧆ controller ӧٚฎӞӻ Rest ളݗ̶ controller._method
ᭆ DELETE, PUT ᔄࣳጱ᧗҅ಅݎ឴ݐ method ොୗ̶ἕᦊ http method Ӿ឴ݐ҅֕ํԶਮಁᒒӧඪ೮ զݢզᦡᗝԅ GET ݇හ᯾឴ݐ̶
JavaScript export default class extends think.controller.rest { init(http){ super.init(http); ਁྦྷጱ _method ݇හ឴ݐ GET _method҅ᤒᐏ ᦡᗝ// Ӿ឴ݐ method http ڞ҅کইຎဌํݐ// this._method = '_method'; } } controller.resource
Rest ଫጱ Resource ݷᑍ̶ ڹ୮ controller.id
ᩒრ ID controller.modelInstance
ᩒრଫ model ጱਫ̶ֺ
ොဩ controller.__before()
ᚆ̶ۑᶭ̵ᴴ໊ḵᒵړݢզࣁṹොဩ __before Ӿᬰᤈਁྦྷᬦᄁ̵ JavaScript export default class extends think.controller.rest{ __before(){ //ᬦᄁ password ਁྦྷ this.modelInstance.field('password', true); } } controller.getAction()
ᤒ̶ڜݐڞވ឴ݐᩒრහഝ҅ইຎํ id҅ݐӞ҅
JavaScript දץොဩਫሿ҅ݢզ໑ഝᵱᥝ// export default class extends think.controller.rest { * getAction(){ let data; if (this.id) { let pk = yield this.modelInstance.getPk(); data = yield this.modelInstance.where({[pk]: this.id}).find(); return this.success(data); } data = yield this.modelInstance.select(); return this.success(data); } } controller.postAction()
හഝےႲ
JavaScript දץොဩਫሿ҅ݢզ໑ഝᵱᥝ// export default class extends think.controller.rest { * postAction(){ let pk = yield this.modelInstance.getPk(); let data = this.post(); delete data[pk]; if(think.isEmpty(data)){ return this.fail('data is empty'); } let insertId = yield this.modelInstance.add(data); return this.success({id: insertId}); } } controller.deleteAction()
ᴻහഝڢ
JavaScript දץොဩਫሿ҅ݢզ໑ഝᵱᥝ// export default class extends think.controller.rest { * deleteAction(){ if (!this.id) { return this.fail('params error'); } let pk = yield this.modelInstance.getPk(); let rows = yield this.modelInstance.where({[pk]: this.id}).delete(); return this.success({affectedRows: rows}); } } controller.putAction()
ๅෛහഝ
JavaScript දץොဩਫሿ҅ݢզ໑ഝᵱᥝ// export default class extends think.controller.rest { * putAction(){ if (!this.id) { return this.fail('params error'); } let pk = yield this.modelInstance.getPk(); let data = this.post(); delete data[pk]; if (think.isEmpty(data)) { return this.fail('data is empty'); } let rows = yield this.modelInstance.where({[pk]: this.id}).update(data); return this.success({affectedRows: rows}); } } controller.__call()
ොဩ᧣አکತӧ JavaScript export default class extends think.controller.rest { __call(){ return this.fail(think.locale('ACTION_INVALID', this.http.action, this.http.url)); } } model
think.model.base ᖀಥᛔ think.base ᔄ̶
አ ES6 ጱဩᖀಥᧆᔄֵ
JavaScript export default class extends think.model.base { getList(){
} }
አฦ᭗ොୗᖀಥᧆᔄֵ
JavaScript module.exports = think.model({ getList: function(){
} })
ં model.pk
හഝᤒԆᲫ҅ἕᦊԅ id ̶ model.name
կݷӾᥴຉ̶ڹཛྷࣳݷ҅ἕᦊ୮
̶ կ᪠ஆԅ for/bar/app/home/model/user.js҅ᮎԍᥴຉጱཛྷࣳݷԅ userڹ୮ model.tablePrefix
̶ _ᖗ҅ἕᦊԅ thinkڹහഝᤒݷᑍ model.tableName
ᖗ̶ἕᦊᒵԭཛྷࣳݷ̶ڹތහഝᤒݷᑍ҅ӧ۱ model.fields
ຉ̶ړහഝᤒਁྦྷ҅ἕᦊᛔۖහഝᤒ model.indexes
ຉ̶ړᔮහഝପտᛔۖහഝᤒىහഝᤒᔱ҅ model.readonlyFields
ᤒ҅හഝๅෛӧտๅෛᬯԶਁྦྷ̶ڜݝਁྦྷ model.config
ਧ̶ײᯈᗝ҅ਫֺ۸ጱ model._db
ᬳളහഝପݙຢ̶ model._data
֢ጱහഝ̶ model._options
֢ᭌᶱ̶
ොဩ model.model(name, options, module) name {String} ཛྷࣳݷᑍ options {Object} ᯈᗝᶱ module {String} ཛྷࣘݷ return {Object}
឴ݐཛྷࣳਫֺ҅ݢզཛྷࣘ឴ݐ̶ JavaScript export default class extends think.model.base { * getList(){ ཛྷࣳਫֺ user ឴ݐ// let instance = this.model('user'); let list = yield instance.select(); let ids = list.map(item => { return item.id; }); let data = yield this.where({id: ['IN', ids]}).select(); return data; } } model.getTablePrefix()
return {string}
ᖗ̶ڹ឴ݐᤒݷ model.getConfigKey()
return {String}
឴ݐᯈᗝଫጱ key҅ᖨਂ db ݙຢֵአ̶ model.db()
return {Object}
ፗളᬬࢧ̶ڞጱᯈᗝ឴ݐ db ਫֺ҅ইຎ૪ᕪਂࣁڹ໑ഝ୮ model.getModelName() return {String} ཛྷࣳݷᑍ
ጱկݷ̶ڹᥴຉ୮ڞވፗളᬬࢧ҅ڞইຎ૪ᕪᯈᗝ model.getTableName()
ᖗڹᤒތreturn {String} ឴ݐᤒݷ҅۱
ᖗ̶ڹᤒތ឴ݐᤒݷ҅۱ model.cache(key, timeout) key {String} ᖨਂ key ԅᑁ֖ܔtimeout {Number} ᖨਂํපᳵ҅ return {this}
ᦡᗝᖨਂᭌᶱ̶
ᦡᗝᖨਂ key ᳵ
JavaScript export default class extends think.model.base { getList(){ return this.cache('getList', 1000).where({id: {'>': 100}}).select(); } }
ݝᦡᗝᖨਂᳵ҅ᖨਂ key ᛔۖኞ౮
JavaScript export default class extends think.model.base { getList(){ return this.cache(1000).where({id: {'>': 100}}).select(); } }
௳מᦡᗝๅग़ጱᖨਂ
JavaScript export default class extends think.model.base { getList(){ return this.cache({ key: 'getList', timeout: 1000, //ֵአկොୗᖨਂ 'file' type: }).where({id: {'>': 100}}).select(); } } model.limit(offset, length) offset {Number} ᦡᗝັᧃጱ᩸ত֖ᗝ length {Number} ᦡᗝັᧃጱහഝᳩଶ return {this}
կ̶ګᦡᗝັᧃᕮຎጱᴴ
හഝᳩଶګᴴ JavaScript export default class extends think.model.base { getList(){ //ັᧃ20හഝ return this.limit(20).where({id: {'>': 100}}).select(); } }
හഝ᩸ত֖ᗝᳩଶګᴴ
JavaScript export default class extends think.model.base { getList(){ ᩸ত֖ᗝ100তັᧃ20᧣හഝ// return this.limit(100, 20).where({id: {'>': 100}}).select(); } } model.page(page, listRows)
ᶭ҅ 1 তڹpage {Number} ୮ listRows {Number} ྯᶭጱහ return {this}
ᶭහഝ҅ᛔۖ۸ԅ limit හഝ̶ړᦡᗝັᧃ
JavaScript export default class extends think.model.base { getList(){ //ັᧃᒫ 2 ᶭහഝ҅ྯᶭ 10 හഝ return this.page(2, 10).where({id: {'>': 100}}).select(); } } model.where(where)
where {String | Object} where կ return {this}
ᦡᗝ where ັᧃկ̶ݢզ᭗ᬦં _logic ᦡᗝ᭦ᬋ҅ἕᦊԅ AND ̶ݢզ᭗ᬦં _complex ᦡᗝ ݳັᧃ̶॔
ဳ ғ1̵զӥᐏֺӧᭇݳ mongo model҅mongo Ӿᦡᗝ where կ᧗ᥠ model.mongo ᯾ጱ where կᦡ ݢᚆտํᄋ၏̶ڞވᵱᥝࣁ Logic ᯾؉හഝ໊ḵ҅ਧ̶2̵where կӾጱ
ฦ᭗կ JavaScript export default class extends think.model.base { where1(){ //SELECT * FROM `think_user` return this.where().select(); } where2(){ //SELECT * FROM `think_user` WHERE ( `id` = 10 ) return this.where({id: 10}).select(); } where3(){ //SELECT * FROM `think_user` WHERE ( id = 10 OR id < 2 ) return this.where('id = 10 OR id < 2').select(); } where4(){ //SELECT * FROM `think_user` WHERE ( `id` != 10 ) return this.where({id: ['!=', 10]}).select(); } }
null կ
JavaScript export default class extends think.model.base { where1(){ //SELECT * FROM `think_user` where ( title IS NULL ); return this.where({title: null}).select(); } where2(){ //SELECT * FROM `think_user` where ( title IS NOT NULL ); return this.where({title: ['!=', null]}).select(); } }
EXP կ
ӧ๕ᤩԎ҅ݢզֵአ EXP٭ӞԶᇙྛጱఘײᄋ၏̶ํقᬰᤈԎ҅ᴠྊਞThinkJS ἕᦊտਁྦྷ ጱොୗ҅ইғ
JavaScript export default class extends think.model.base { where1(){ //SELECT * FROM `think_user` WHERE ( (`name` ='name') ) return this.where({name: ['EXP', "=\"name\""]}).select(); } } LIKE կ
JavaScript export default class extends think.model.base { where1(){ //SELECT * FROM `think_user` WHERE ( `title` NOT LIKE 'welefen' ) return this.where({title: ['NOTLIKE', 'welefen']}).select(); } where2(){ //SELECT * FROM `think_user` WHERE ( `title` LIKE '%welefen%' ) return this.where({title: ['like', '%welefen%']}).select(); } ग़ӻ like// where3(){ //SELECT * FROM `think_user` WHERE ( (`title` LIKE 'welefen' OR `title` LIKE 'suredy') ) return this.where({title: ['like', ['welefen', 'suredy']]}).select(); } Ӟӻ like ᔮىग़ӻਁྦྷጱ// where4(){ //SELECT * FROM `think_user` WHERE ( (`title` LIKE '%welefen%') OR (`content` LIKE '%welefen%') ) return this.where({'title|content': ['like', '%welefen%']}).select(); } Ӟӻ Like ᔮىग़ӻਁྦྷӨጱ// where5(){ //SELECT * FROM `think_user` WHERE ( (`title` LIKE '%welefen%') AND (`content` LIKE '%welefen%') ) return this.where({'title&content': ['like', '%welefen%']}).select(); } }
IN կ
JavaScript export default class extens think.model.base { where1(){ //SELECT * FROM `think_user` WHERE ( `id` IN ('10','20') ) return this.where({id: ['IN', '10,20']}).select(); } where2(){ //SELECT * FROM `think_user` WHERE ( `id` IN (10,20) ) return this.where({id: ['IN', [10, 20]]}).select(); } where3(){ //SELECT * FROM `think_user` WHERE ( `id` NOT IN (10,20) ) return this.where({id: ['NOTIN', [10, 20]]}).select(); } }
BETWEEN ັᧃ JavaScript export default class extens think.model.base { where1(){ //SELECT * FROM `think_user` WHERE ( (`id` BETWEEN 1 AND 2) ) return this.where({id: ['BETWEEN', 1, 2]}).select(); } where2(){ //SELECT * FROM `think_user` WHERE ( (`id` BETWEEN '1' AND '2') ) return this.where({id: ['between', '1,2']}).select(); } }
ग़ਁྦྷັᧃ
JavaScript export default class extends think.model.base { where1(){ //SELECT * FROM `think_user` WHERE ( `id` = 10 ) AND ( `title` = 'www' ) return this.where({id: 10, title: "www"}).select(); } OR ද᭦ᬋԅץ// where2(){ //SELECT * FROM `think_user` WHERE ( `id` = 10 ) OR ( `title` = 'www' ) return this.where({id: 10, title: "www", _logic: 'OR'}).select(); } XOR ද᭦ᬋԅץ// where2(){ //SELECT * FROM `think_user` WHERE ( `id` = 10 ) XOR ( `title` = 'www' ) return this.where({id: 10, title: "www", _logic: 'XOR'}).select(); } }
ग़կັᧃ
JavaScript export default class extends think.model.base { where1(){ //SELECT * FROM `think_user` WHERE ( `id` > 10 AND `id` < 20 ) return this.where({id: {'>': 10, '<': 20}}).select(); } OR ද᭦ᬋԅץ// where2(){ //SELECT * FROM `think_user` WHERE ( `id` < 10 OR `id` > 20 ) return this.where({id: {'<': 10, '>': 20, _logic: 'OR'}}).select() } } ݳັᧃ॔
JavaScript export default class extends think.model.base { where1(){ //SELECT * FROM `think_user` WHERE ( `title` = 'test' ) AND ( ( `id` IN (1,2,3) ) OR ( `content` = 'www' ) ) return this.where({ title: 'test', _complex: {id: ['IN', [1, 2, 3]], content: 'www', _logic: 'or' } }).select() } } model.field(field) field {String | Array} ᦡᗝᥝັᧃጱਁྦྷ҅ݢզฎਁᒧԀ҅Ԟݢզฎහᕟ return {this}
ᦡᗝᥝັᧃጱਁྦྷ̶
ਁᒧԀොୗ
JavaScript export default class extends think.controller.base { async indexAction(){ let model = this.model('user'); ᦡᗝᥝັᧃጱਁᒧԀ҅ਁᒧԀොୗ҅ग़ӻአ᭖ݩᵍ// let data = await model.field('name,title').select(); } }
හڍ አ SQL᧣
JavaScript export default class extends think.controller.base { හڍ SQL ᯾᧣አྦྷਁ// async listAction(){ let model = this.model('user'); let data = await model.field('id, INSTR(\'30,35,31,\',id + \',\') as d').select(); } }
හᕟොୗ JavaScript export default class extends think.controller.base { async indexAction(){ let model = this.model('user'); //ᦡᗝᥝັᧃጱਁᒧԀ҅හᕟොୗ let data = await model.field(['name','title']).select(); } } model.fieldReverse(field)
ᬯԶਁྦྷތӧ۱ײᧃጱັܨᭌਁྦྷ҅ݍ {field {String | Array return {this}
տᬦᄁᬯԶਁྦྷ҅ඪ೮ਁᒧԀහᕟ 2 ᐿොୗ̶ײᭌਁྦྷ҅ັᧃጱݍᦡᗝ model.table(table, hasPrefix) table {String} ᤒݷ ᖗڹᤒےӧࣁႲڞᑮ໒҅ํތ ᖗ҅ইຎ tableڹ૪ᕪํԧᤒވhasPrefix {Boolean} ฎ return {this}
ᦡᗝᤒݷ҅ݢզਖ਼Ӟӻ SQL ݙᦡᗝԅᤒݷ̶
ᤒݷڹᦡᗝ୮
JavaScript export default class extends think.model.base { getList(){ return this.table('test', true).select(); } }
SQL ݙ֢ԅᤒݷ
JavaScript export default class extends think.model.base { async getList(){ let sql = await this.model('group').group('name').buildSql(); let data = await this.table(sql).select(); return data; } } model.union(union, all) union {String | Object} ᘶݳັᧃ SQL ᘏᤒݷ all {Boolean} ฎވฎ UNION ALL ොୗ return {this}
ᘶݳັᧃ̶
SQL ᘶݳັᧃ
JavaScript export default class extends think.model.base { getList(){ //SELECT * FROM `think_user` UNION (SELECT * FROM think_pic2) return this.union('SELECT * FROM think_pic2').select(); } }
ᤒݷᘶݳັᧃ
JavaScript export default class extends think.model.base { getList(){ //SELECT * FROM `think_user` UNION ALL (SELECT * FROM `think_pic2`) return this.union({table: 'think_pic2'}, true).select(); } } model.join(join) join {String | Object | Array} ᥝᕟݳጱັᧃݙ҅ἕᦊԅ LEFT JOIN return {this}
ᕟݳັᧃ҅ඪ೮ਁᒧԀ̵හᕟᒵग़ᐿොୗ̶
ਁᒧԀ
JavaScript export default class extends think.model.base { getList(){ //SELECT * FROM `think_user` LEFT JOIN think_cate ON think_group.cate_id=think_cate.id return this.join('think_cate ON think_group.cate_id=think_cate.id').select(); } }
හᕟ JavaScript export default class extends think.model.base { getList(){ //SELECT * FROM `think_user` LEFT JOIN think_cate ON think_group.cate_id=think_cate.id RIGHT JOIN think_tag ON think_group.tag_id=think_tag.id return this.join([ 'think_cate ON think_group.cate_id=think_cate.id', 'RIGHT JOIN think_tag ON think_group.tag_id=think_tag.id' ]).select(); } }
ғܔӻᤒ
JavaScript export default class extends think.model.base { getList(){ //SELECT * FROM `think_user` INNER JOIN `think_cate` AS c ON think_user.`cate_id`=c.`id` return this.join({ table: 'cate', join: 'inner', //join ොୗ҅ํ left, right, inner 3 ᐿොୗ ݷڦᤒ // 'c', as: on: ['cate_id', 'id'] //ON կ }).select(); } }
ғग़ེ JOIN
JavaScript export default class extends think.model.base { getList(){ //SELECT * FROM think_user AS a LEFT JOIN `think_cate` AS c ON a.`cate_id`=c.`id` LEFT JOIN `think_group_tag` AS d ON a.`id`=d.`group_id` return this.alias('a').join({ table: 'cate', join: 'left', as: 'c', on: ['cate_id', 'id'] }).join({ table: 'group_tag', join: 'left', as: 'd', on: ['id', 'group_id'] }).select() } }
ғग़ӻᤒ JavaScript export default class extends think.model.base { getList(){ //SELECT * FROM `think_user` LEFT JOIN `think_cate` ON think_user.`id`=think_cate.`id` LEFT JOIN `think_group_tag` ON think_user.`id`=think_group_tag.`group_id` return this.join({ cate: { on: ['id', 'id'] }, group_tag: { on: ['id', 'group_id'] } }).select(); } }
JavaScript export default class extends think.model.base { getList(){ //SELECT * FROM think_user AS a LEFT JOIN `think_cate` AS c ON a.`id`=c.`id` LEFT JOIN `think_group_tag` AS d ON a.`id`=d.`group_id` return this.alias('a').join({ cate: { ӻ 3 left,right,inner ํ // 'left', join: as: 'c', on: ['id', 'id'] }, group_tag: { join: 'left', as: 'd', on: ['id', 'group_id'] } }).select() } }
ғON կތํग़ӻਁྦྷ JavaScript export default class extends think.model.base { getList(){ //SELECT * FROM `think_user` LEFT JOIN `think_cate` ON think_user.`id`=think_cate.`id` LEFT JOIN `think_group_tag` ON think_user.`id`=think_group_tag.`group_id` LEFT JOIN `think_tag` ON (think_user.`id`=think_tag.`id` AND think_user.`title`=think_tag.`name`) return this.join({ cate: {on: 'id, id'}, group_tag: {on: ['id', 'group_id']}, tag: { on: { // ग़ӻਁྦྷጱ ON id: 'id', title: 'name' } } }).select() } }
ԅ SQL ݙ ғtable
JavaScript export default class extends think.model.base { async getList(){ let sql = await this.model('group').buildSql(); //SELECT * FROM `think_user` LEFT JOIN ( SELECT * FROM `think_group` ) ON think_user.`gid`=( SELECT * FROM `think_group` ).`id` return this.join({ table: sql, on: ['gid', 'id'] }).select(); } } model.order(order)
order {String | Array | Object} ഭଧොୗ return {this}
ᦡᗝഭଧොୗ̶
ਁᒧԀ JavaScript export default class extends think.model.base { getList(){ //SELECT * FROM `think_user` ORDER BY id DESC, name ASC return this.order('id DESC, name ASC').select(); } getList1(){ //SELECT * FROM `think_user` ORDER BY count(num) DESC return this.order('count(num) DESC').select(); } }
හᕟ
JavaScript export default class extends think.model.base { getList(){ //SELECT * FROM `think_user` ORDER BY id DESC,name ASC return this.order(['id DESC', 'name ASC']).select(); } }
JavaScript export default class extends think.model.base { getList(){ //SELECT * FROM `think_user` ORDER BY `id` DESC,`name` ASC return this.order({ id: 'DESC', name: 'ASC' }).select(); } }
model.alias(tableAlias)
ݷڦtableAlias {String} ᤒ return {this}
ݷ̶ڦᦡᗝᤒ JavaScript export default class extends think.model.base { getList(){ //SELECT * FROM think_user AS a; return this.alias('a').select(); } } model.having(having)
having {String} having ັᧃጱਁᒧԀ return {this}
ᦡᗝ having ັᧃ̶
JavaScript export default class extends think.model.base { getList(){ //SELECT * FROM `think_user` HAVING view_nums > 1000 AND view_nums < 2000 return this.having('view_nums > 1000 AND view_nums < 2000').select(); } } model.group(group)
ᕟັᧃጱਁྦྷړ {group {String return {this}
ᕟັᧃ̶ړᦡਧ
JavaScript export default class extends think.model.base { getList(){ //SELECT * FROM `think_user` GROUP BY `name` return this.group('name').select(); } } model.distinct(distinct)
distinct {String} ݄᯿ጱਁྦྷ return {this}
݄᯿ັᧃ̶ JavaScript export default class extends think.model.base { getList(){ //SELECT DISTINCT `name` FROM `think_user` return this.distinct('name').select(); } } model.explain(explain) explain ಗᤈ ےႲވexplain {Boolean} ฎ return {this} explain ಗᤈ҅አັ፡ SQL ጱᚆ̶ ےႲڹࣁ SQL ԏވฎ model.optionsFilter(options)
֢ᭌᶱᬦᄁ̶ model.dataFilter(data) data {Object | Array} ᥝ֢ጱහഝ
හഝᬦᄁ̶ model.beforeAdd(data)
ጱහഝےdata {Object} ᥝႲ
ᗝ̶֢ڹےႲ model.afterAdd(data)
ጱහഝےdata {Object} ᥝႲ
ݸᗝ̶֢ےႲ model.afterDelete(data)
ᴻݸᗝ̶֢ڢ model.beforeUpdate(data)
data {Object} ᥝๅෛጱහഝ
ᗝ̶֢ڹๅෛ model.afterUpdate(data)
data {Object} ᥝๅෛጱහഝ
ๅෛݸᗝ̶֢ model.afterFind(data)
data {Object} ັᧃጱܔහഝ return {Object | Promise} find ັᧃݸᗝ̶֢ model.afterSelect(data)
data [Array] ັᧃጱහഝහഝ return {Array | Promise} select ັᧃݸᗝ̶֢ model.data(data)
data {Object}
ๅෛ֢ᦡᗝ֢ጱහഝ̶ےႲ model.options(options)
options {Object}
ᦡᗝ֢ᭌᶱ̶ইғ
JavaScript export default class extends think.model.base { getList(){ return this.options({ where: 'id = 1', limit: [10, 1] }).select(); } } model.close()
ӥӧᥝፗള᧣አ̶٭ԭහഝପᬳള҅Ӟᛱఘى model.getTableFields(table) table {String} ᤒݷ return {Promise}
ᛔۖහഝପӾݐ̶҅௳מ឴ݐᤒጱਁྦྷ model.getLastSql()
return {String}
឴ݐ๋ݸಗᤈጱ SQL ݙ̶ model.buildSql()
return {Promise}
ጱັᧃկኞ౮Ӟӻ SQL ݙ̶ڹਖ਼୮ model.parseOptions(oriOpts, extraOptions)
oriOpts {Object} extraOptions {Object} return {Promise}
ጱ֢ᭌᶱ̶ڹ໑ഝ૪ᕪᦡਧጱӞԶկᥴຉ୮ model.getPk()
return {Promise}
ᬬࢧӞӻ Promise̶҅ᬬࢧ pk ጱ model.parseType(field, value) field {String} හഝᤒӾጱਁྦྷݷᑍ value {Mixed} return {Mixed}
໑ഝහഝᤒӾጱਁྦྷᔄࣳᥴຉ value̶ model.parseData(data)
data {Object} ᥝᥴຉጱහഝ return {Object} ᧣አ parseType ොဩᥴຉහഝ̶ model.add(data, options, replace)
ጱහഝےdata {Object} ᥝႲ options {Object} ֢ᭌᶱ ฎ๊ഘ֢ވreplace {Boolean} ฎ ጱ IDفreturn {Promise} ᬬࢧൊ
Ӟහഝ̶ےႲ model.thenAdd(data, where)
ጱහഝےdata {Object} ᥝႲ where {Object} where կ return {Promise}
හഝ̶ےձ֜හഝႲک୮ where կ๚Ӿ model.addMany(dataList, options, replace)
ᤒڜጱහഝےdataList {Array} ᥝႲ options {Object} ֢ᭌᶱ ฎ๊ഘ֢ވreplace {Boolean} ฎ ጱ IDفreturn {Promise} ᬬࢧൊ
ग़හഝ̶ےӞེႲ model.delete(options) options {Object} ֢ᭌᶱ return {Promise} ᬬࢧߥጱᤈහ
ᴻහഝ̶ڢ model.update(data, options)
data {Object} ᥝๅෛጱහഝ options {Object} ֢ᭌᶱ return {Promise} ᬬࢧߥጱᤈහ
ๅෛහഝ̶ updateMany(dataList, options) ᤒڜdataList {Array} ᥝๅෛጱහഝ options {Object} ֢ᭌᶱ return {Promise}
տᛔۖᦡᗝԅๅෛկ̶҅ԆᲫጱތๅෛग़හഝ҅dataList ᯾ᶳ۱ model.increment(field, step) field {String} ਁྦྷݷ ἕᦊԅ 1҅ጱےstep {Number} ी return {Promise}
̶ےीྦྷਁ model.decrement(field, step) field {String} ਁྦྷݷ ἕᦊԅ 1҅ጱےstep {Number} ी return {Promise}
̶ٺྦྷਁ model.find(options) options {Object} ֢ᭌᶱ return {Promise} ᬬࢧܔහഝ
̶ {} ԅහഝ҅ᬬࢧىፘکහഝ҅ᬬࢧጱහഝᔄࣳԅ̶ইຎ๚ັᧃܔᧃັ model.select(options) options {Object} ֢ᭌᶱ return {Promise} ᬬࢧग़හഝ
̶ [] ԅහഝ҅ᬬࢧىፘکහഝ҅ᬬࢧጱහഝᔄࣳԅහᕟ̶ইຎ๚ັᧃܔᧃັ model.countSelect(options, pageFlag) options {Object} ֢ᭌᶱ ݸӞᶭ҅ἕᦊӧ๋کྋץᒫӞᶭ҅false ԅکྋץpageFlag {Boolean} ୮ᶭහӧݳဩ॒ቘ҅true ԅ ྋץ return {Promise}
ᶭັᧃ҅Ӟᛱᵱᥝᕮݳ page ොဩӞֵ᩸አ̶ইғړ JavaScript export default class extends think.controller.base { async listAction(){ let model = this.model('user'); let data = await model.page(this.get('page')).countSelect(); } }
හഝᕮইӥғᬬࢧ
JavaScript { numsPerPage: 10, //ྯᶭดᐏጱහ ᶭڹ//୮ 1, currentPage: count: 100, //හ totalPages: 10, //ᶭහ ᤒڜᶭӥጱහഝڹ//୮ [{ data: name: "thinkjs", email: "[email protected]" }, ...] } model.getField(field, one) field {String} ਁྦྷݷ҅ग़ӻਁྦྷአ᭖ݩᵍ one {Boolean | Number} ឴ݐጱහ return {Promise}
̶឴ݐᇙਧਁྦྷጱ model.count(field) field {String} ਁྦྷݷ return {Promise} ᬬࢧහ
឴ݐහ̶ model.sum(field) field {String} ਁྦྷݷ return {Promise}
ᬰᤈ̶ਁྦྷ model.min(field) field {String} ਁྦྷݷ return {Promise}
̶ਁྦྷጱ๋ੜ model.max(field) field {String} ਁྦྷݷ return {Promise}
̶ਁྦྷጱ๋य़ model.avg(field) field {String} ਁྦྷݷ return {Promise}
̶ਁྦྷጱଘ࣐ model.query(…args)
return {Promise}
ਧ SQL ݙಗᤈັᧃ̶ model.execute(…args)
return {Promise}
ಗᤈ SQL ݙ̶ model.parseSql(sql, …args) sql {String} ᥝᥴຉጱ SQL ݙ return {String}
ᥴຉ SQL ݙ҅᧣አ util.format ොဩᥴຉ SQL ݙ҅ଚਖ਼ SQL ݙӾጱ __TABLENAME__ ᥴຉԅ ଫጱᤒݷ̶ JavaScript export default class extends think.model.base { getSql(){ let sql = 'SELECT * FROM __GROUP__ WHERE id=%d'; sql = this.parseSql(sql, 10); //sql is SELECT * FROM think_group WHERE id=10 } } model.startTrans()
return {Promise}
̶ۓԪސ model.commit()
return {Promise}
̶ۓԻԪ model.rollback()
return {Promise}
̶ۓࢧ჻Ԫ model.transaction(fn)
හڍfn {Function} ᥝಗᤈጱ return {Promise}
හᥝᬬࢧ Promise̶ڍහ҅ڍಗᤈփ᭓ጱۓአԪֵ
JavaScript export default class extends think.model.base { updateData(data){ return this.transaction(async () => { let insertId = await this.add(data); let result = await this.model('user_cate').add({user_id: insertId, cate_id: 100}); return result; }) } } MongoDB
think.model.mongo ᖀಥᔄ think.model.base̶
አ ES6 ጱဩᖀಥᧆᔄֵ
JavaScript export default class extends think.model.mongo { getList(){
} }
አฦ᭗ොୗᖀಥᧆᔄֵ
JavaScript module.exports = think.model('mongo', { getList: function(){
} })
ં model.fields
ᦡᗝਁྦྷ҅ইғ
JavaScript export default class extends think.model.mongo { init(...args){ super.init(...args); //ᦡᗝਁྦྷ this.fields = { name: { type: 'string' }, pwd: { type: 'string' } } } }
ຝଚӧտਁྦྷᬰᤈ༄ັ̶ڹဳ ғፓ model.indexes
ୌᔱ̶ڠտᛔۖڹᦡᗝਁྦྷᔱ҅හഝ֢ԏ
JavaScript export default class extends think.model.mongo { init(...args){ super.init(...args); //ᯈᗝᔱ this.indexes = {
} } }
ܔਁྦྷᔱ
JavaScript export default class extends think.model.mongo { init(...args){ super.init(...args); //ᯈᗝᔱ this.indexes = { name: 1 } } }
ࠔӞᔱ
᭗ᬦ $unique ਧԅࠔӞᔱ҅ইғ
JavaScript export default class extends think.model.mongo { init(...args){ super.init(...args); //ᯈᗝᔱ this.indexes = { name: {$unique: 1} } } }
ग़ਁྦྷᔱ
ݢզਖ਼ग़ӻਁྦྷᘶݳᔱ҅ইғ JavaScript export default class extends think.model.mongo { init(...args){ super.init(...args); //ᯈᗝᔱ this.indexes = { email: 1 test: { name: 1, title: 1, $unique: 1 } } } } model.pk
ԆᲫݷ҅ἕᦊԅ _id ҅ݢզ᭗ᬦ this.getPk ොဩ឴ݐ̶
ොဩ model.where(where)
ᔮහഝପӾӧॡӞ̶ىmongo ཛྷࣳӾጱ where կᦡᗝ
ෙڣᒵԭ
JavaScript export default class extends think.model.mongo { where1(){ return this.where({ type: "snacks" }).select(); } }
AND կ
JavaScript export default class extends think.model.mongo { where1(){ return this.where({ type: 'food', price: { $lt: 9.95 } }).select(); } }
OR կ JavaScript export default class extends think.model.mongo { where1(){ return this.where({ $or: [ { qty: { $gt: 100 } }, { price: { $lt: 9.95 } } ] }).select(); } where2(){ return this.where({ type: 'food', $or: [ { qty: { $gt: 100 } }, { price: { $lt: 9.95 } } ] }).select(); } }
્ٖ
JavaScript export default class extends think.model.mongo { where1(){ return this.where( { producer: { company: 'ABC123', address: '123 Street' } }).select(); } where2(){ return this.where({ 'producer.company': 'ABC123' } ).select(); } }
IN կ
JavaScript export default class extends think.model.mongo { where1(){ return this.where({ type: { $in: [ 'food', 'snacks' ] } }).select(); } }
ๅग़᧗ᥠ https://docs.mongodb.org/manual/reference/operator/query/#query-selectors̶ model.collection()
return {Promise} ᤒጱݙຢ̶ڹ឴ݐ֢୮
JavaScript export default class extends think.model.mongo { async getIndexes(){ let collection = await this.collection(); return collection.indexes(); } } model.aggregate(options)
̶/ᘸݳັᧃ̶ٍ֛᧗ᥠ https://docs.mongodb.org/manual/core/aggregation-introduction model.mapReduce(map, reduce, out)
̶/mapReduce ٍ֢֛҅᧗ᥠ https://docs.mongodb.org/manual/core/map-reduce model.createIndex(indexes, options)
indexes {Object} ᔱᯈᗝ options {Object}
ୌᔱ̶ڠ model.getIndexes()
return {Promise}
឴ݐᔱ̶ middleware
think.middleware.base ᔄᖀಥᛔ think.http.base̶
ES6 ොୗ
JavaScript export default class extends think.middleware.base { run(){
} } ୌᔄጱොୗڠாۖ
JavaScript module.exports = think.middleware({ run: function(){
} })
ොဩ middleare.run()
return {Promise}
ݗ҅᧣አ middleware տᛔۖ᧣አᧆොဩ̶فmiddleware क़ጱොဩ