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. 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){%>

  • <%=item.name%>
  • <%})%>

    ᬦᄁ࢏

    /ᚆ҅ݢզࣁ 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 %}

    {% block left %}{% endblock %}

    {% block right %} This is more 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')%>

  • home
  • <%}else{%>
  • home
  • <%}%> config

    ᭗ᬦ 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 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_id؀fKey ጱἕᦊ

    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ڹᦡ୮؃ ̶ ԅ id؀fKey ጱἕᦊ ྦྷਁ 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_id؀fKey ἕᦊ

    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 create project module add module controller add controller service add service model add model middleware add middleware adapter add adapter plugin create ThinkJS plugin

    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 project mode type(mini, normal, module), default is module, used in `new` command

    ୌᶱፓڠ

    ୌᶱፓݢզ᭗ᬦ 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'], //ᥴຉ }

    ጱᦾ҅ݢզ᭗ᬦӥᶎጱොୗғےইຎࣁܻํᯈᗝӤी̶؀Ӥᶎጱᯈᗝտᥟፍധἕᦊጱᯈᗝ

    ےᶎ᭄ڹࣁ

    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 ੒क़ጱොဩ