Comparar commits

...

596 Commits

Autor SHA1 Mensagem Data
Tj Holowaychuk 117c5f0794 Release 1.0.6 2011-02-07 13:45:25 -08:00
Tj Holowaychuk 4a49bb41a5 Fixed "view engine" setting bug when period is in dirname 2011-02-07 13:44:38 -08:00
Tj Holowaychuk 0345800aef Added failing test due to period in the dirname when utilizing "view engine" 2011-02-07 13:42:36 -08:00
Tj Holowaychuk fce227a3a0 package.json dep typo 2011-02-07 09:17:52 -08:00
Tj Holowaychuk be3c27cedc Updated qs submodule 2011-02-07 08:47:09 -08:00
Tj Holowaychuk 68a58e2fdf Release 1.0.5 2011-02-05 11:16:21 -08:00
Tj Holowaychuk 28361c9279 Added secret to generated app 2011-02-05 11:15:48 -08:00
Tj Holowaychuk 82e15cf321 Release 1.0.4 2011-02-05 11:13:08 -08:00
Tj Holowaychuk 4c0825b670 Added qs dep 2011-02-05 11:12:00 -08:00
Tj Holowaychuk f353aa3384 Added qs submod for testing 2011-02-05 11:11:34 -08:00
Tj Holowaychuk a7eacec1f2 Fixed namespaced requires 2011-02-05 11:10:47 -08:00
Tj Holowaychuk 5ecec0a492 Updated connect submodule 2011-02-05 11:09:41 -08:00
Tj Holowaychuk 8c7241db02 connect >= 0.5.x 2011-02-01 08:33:45 -08:00
Tj Holowaychuk 107ebcb0c1 Updated connect submodule 2011-02-01 08:33:14 -08:00
Tj Holowaychuk 7dd93a5d55 generate docs 2011-01-29 12:20:47 -08:00
Tj Holowaychuk c41c99e18a Added eco template engine 2011-01-29 12:20:10 -08:00
Tj Holowaychuk 5b50b48e08 docs for session secret 2011-01-29 12:19:19 -08:00
Tj Holowaychuk 077e09f922 more req.flash() docs 2011-01-29 12:17:20 -08:00
Tj Holowaychuk 059803b5bc updated jade 2011-01-29 12:14:15 -08:00
Tj Holowaychuk 59d18d245f Added tests to confirm that partials in layouts work 2011-01-25 10:13:15 -08:00
Tj Holowaychuk a481ddf9bf Fixed session related tests for updated connect 2011-01-15 19:42:34 -08:00
Tj Holowaychuk b1042abbe3 Updated connect submodule 2011-01-15 19:41:35 -08:00
Tj Holowaychuk cb1f536eb5 Release 1.0.3 2011-01-13 14:09:00 -08:00
Ryan Grove 7791169810 Remove unsafe characters from JSONP callback names.
This prevents JSONP callbacks from being used as an XSS vector. The set
of acceptable characters is intentionally more limited than the full
set of valid characters in JS identifiers in order to avoid complexity,
but this could be expanded in the future if necessary.
2011-01-13 14:06:57 -08:00
Tj Holowaychuk 1b854f4297 Added .gitignore 2011-01-10 18:11:23 -08:00
Tj Holowaychuk 52353da08b Release 1.0.2 2011-01-10 18:09:16 -08:00
Tj Holowaychuk dc56b9b603 Removed nested require, using connect.router 2011-01-10 18:08:33 -08:00
Tj Holowaychuk 1446135545 docs 2011-01-03 13:33:51 -08:00
Tj Holowaychuk cdc46307d7 Release 1.0.1 2010-12-29 11:38:02 -08:00
Tj Holowaychuk dbf02c231a Fixed for middleware stacked via createServer() 2010-12-29 11:34:27 -08:00
Tj Holowaychuk 4732185e6f Fixed express(1) generated tests for express 0.7.0. Closes #484 2010-12-14 08:22:38 -08:00
Tj Holowaychuk 84a95b3101 Updated connect submodule 2010-12-06 14:54:50 -08:00
Tj Holowaychuk 09e8fe280b older expresso 2010-11-24 08:16:59 -08:00
Tj Holowaychuk 0e4ea9c16b Updated jade submodule 2010-11-24 08:14:44 -08:00
Tj Holowaychuk c7542aef95 Merge branch 'master' into 1.x 2010-11-17 11:26:55 -08:00
Tj Holowaychuk 487d067f75 Fixed route-separation example require 2010-11-17 11:26:50 -08:00
Tj Holowaychuk 6873bce6c6 Merge branch 'master' into 1.x 2010-11-16 18:04:57 -08:00
Tj Holowaychuk c4d5e1b4f3 Docs 2010-11-16 18:04:48 -08:00
Tj Holowaychuk 6ddacb6302 Merge branch 'master' into 1.x 2010-11-16 17:58:33 -08:00
Tj Holowaychuk 0e0cc30039 Docs 2010-11-16 17:58:30 -08:00
Tj Holowaychuk a766cc791b Release 1.0.0 2010-11-16 17:54:58 -08:00
Tj Holowaychuk d017c3e248 Rebuilt docs 2010-11-16 17:43:23 -08:00
Tj Holowaychuk cc27ee04a8 PREFIX 2010-11-16 17:36:31 -08:00
Tj Holowaychuk 87459bf24b undoc manual install method 2010-11-16 17:36:05 -08:00
Tj Holowaychuk e1d33992a7 Merge branch 'master' into 1.x 2010-11-13 10:55:19 -08:00
Tj Holowaychuk 5091c9e10f Added posts to the reoute separation example 2010-11-13 10:55:15 -08:00
Tj Holowaychuk 14a22d9033 Updating users 2010-11-13 10:37:23 -08:00
Tj Holowaychuk 7ded5a2de5 Started route separation example 2010-11-13 10:33:41 -08:00
Tj Holowaychuk 6b436a0192 Fixed github example styling 2010-11-13 09:29:42 -08:00
Tj Holowaychuk 52343686f5 Docs 2010-11-12 09:00:03 -08:00
Tj Holowaychuk eec9d05b19 connect >= 0.3.0 2010-11-12 08:46:29 -08:00
Tj Holowaychuk 569c5139a6 Merge branch 'master' into 1.x 2010-11-12 08:46:07 -08:00
Tj Holowaychuk 89703fd430 Added catchall test 2010-11-12 08:45:47 -08:00
Tj Holowaychuk dc246946a7 Added app.all() support 2010-11-12 08:44:10 -08:00
Tj Holowaychuk 944e1120cb Updated connect submodule 2010-11-12 08:39:39 -08:00
Tj Holowaychuk 6f5f5787e2 Merge branch 'master' into 1.x 2010-11-08 07:18:52 -08:00
Tj Holowaychuk cccda60df8 Added link to node-jqtpl template engine 2010-11-08 07:18:45 -08:00
Tj Holowaychuk e338e748eb Removed Content-Length for chunked 2010-11-05 04:31:56 -07:00
Tj Holowaychuk 0526a24cf3 Renamed pages example to error-pages. Closes #459 2010-11-05 02:39:08 -07:00
Tj Holowaychuk c4ba1b025a Updated jade submodule 2010-10-30 13:35:09 -07:00
Tj Holowaychuk 252f330658 Revert "only register error handlers once"
This reverts commit 45590415a6.
2010-10-29 19:59:18 -07:00
Tj Holowaychuk 45590415a6 only register error handlers once 2010-10-29 19:54:17 -07:00
Tj Holowaychuk e562adc752 Settings docs 2010-10-26 14:15:29 -07:00
Tj Holowaychuk 1e2fd44a6b Removed a set() call 2010-10-26 14:14:47 -07:00
Tj Holowaychuk 94cf769dd7 Merge branch 'master' into 1.x 2010-10-26 12:09:17 -07:00
Tj Holowaychuk 1c903320be New partial() docs 2010-10-26 12:08:59 -07:00
Tj Holowaychuk 74eaf3a268 Added objectName() 2010-10-26 12:02:40 -07:00
Tj Holowaychuk 6fcd74c713 Added missing files 2010-10-26 11:59:31 -07:00
Tj Holowaychuk 33136c6553 Fixed partial local inheritance precedence. Closes #454 2010-10-26 11:50:44 -07:00
Tj Holowaychuk cb225db203 Added failing partial local precedence test [reported by Nick Poulden] 2010-10-26 11:47:13 -07:00
Tj Holowaychuk 0dbd5006ea Caching view path derived partial object names 2010-10-26 11:34:11 -07:00
Tj Holowaychuk 08b3677ce8 Merge branch 'partial-object' 2010-10-26 11:31:46 -07:00
Tj Holowaychuk b08549a25b Added partial direct object support
these are now equivalent:

before:

    partial(movie, { object: movieRecord })

after:

    partial(movie, movieRecord)
2010-10-26 11:31:40 -07:00
Tj Holowaychuk 221bc4cb5d Misc refactor of partial() 2010-10-26 11:22:56 -07:00
Tj Holowaychuk b655b8e97b Added partial object test 2010-10-26 11:22:14 -07:00
Tj Holowaychuk 03e7b5dcc6 Fixed a test 2010-10-26 11:10:43 -07:00
Tj Holowaychuk 6d00b45eed Merge branch 'master' into 1.x 2010-10-26 01:18:24 -07:00
Tj Holowaychuk 5f09e829df Updated connect submodule 2010-10-26 01:18:16 -07:00
Tj Holowaychuk e6759919dc fine with --version 0.2.4 2010-10-25 08:22:58 -07:00
Tj Holowaychuk 6c65a3fc74 Removed old app section from docs 2010-10-22 21:11:41 -07:00
Tj Holowaychuk 6a4c6933aa Merge branch 'master' into 1.x 2010-10-22 16:20:47 -07:00
Tj Holowaychuk e0ffd31123 Added development seed's cool project to applications.html 2010-10-22 16:20:15 -07:00
Tj Holowaychuk c35ee2427e Merge branch 'master' into 1.x 2010-10-21 19:53:39 -07:00
Tj Holowaychuk 4c1597113a Added another partial test 2010-10-21 19:52:33 -07:00
Tj Holowaychuk 4006506b64 Added another partial locals test 2010-10-21 19:42:40 -07:00
Tj Holowaychuk 14facdbcd2 Merge branch 'partial-locals' 2010-10-21 19:29:40 -07:00
Tj Holowaychuk 726ace49d8 Added partial locals test with collection 2010-10-21 19:29:29 -07:00
Tj Holowaychuk f45d383367 Fixed a test 2010-10-21 19:24:44 -07:00
Tj Holowaychuk 3a32e2b53a Added failing partial locals test 2010-10-21 19:15:20 -07:00
Tj Holowaychuk dc45e93cea jsonp text/javascript as per mailinglist discussion 2010-10-21 14:11:07 -07:00
Tj Holowaychuk 3d7216935a Merge branch 'master' into 1.x 2010-10-20 10:07:54 -07:00
Tj Holowaychuk c0f9642719 Merge branch 'bin' 2010-10-20 10:07:48 -07:00
Tj Holowaychuk da8d036997 Implemented --template support 2010-10-20 10:07:43 -07:00
Tj Holowaychuk 3c911cc785 connect >= 0.2.7 2010-10-20 09:54:03 -07:00
Tj Holowaychuk 4071f15f27 Updated connect submodule 2010-10-20 09:49:13 -07:00
Tj Holowaychuk 90de7923db Added -t, --template flag 2010-10-19 17:39:02 -07:00
Tj Holowaychuk c28f1535a3 Started ejs template support for express(1) 2010-10-19 17:37:13 -07:00
Tj Holowaychuk fc15c3d02b Merge branch 'master' into 1.x 2010-10-19 17:19:39 -07:00
Tj Holowaychuk 704e9c132e Rebuilt docs 2010-10-19 17:19:36 -07:00
Tj Holowaychuk 713d6f5f76 Installation suggestions when using express(1) 2010-10-19 17:19:22 -07:00
Tj Holowaychuk 1a6d245eae Added -s, --session[s] support to express(1)
This adds cookieDecoder() / session() middleware for you
2010-10-19 17:12:28 -07:00
Tj Holowaychuk 9eaec5b34e Merge branch 'master' into 1.x 2010-10-19 17:03:18 -07:00
Tj Holowaychuk d909dd2a32 Merge branch 'bin' 2010-10-19 17:03:07 -07:00
Tj Holowaychuk 7bb466dd86 Added -c, -css ENGINE option to express(1)
For example $ express
will now just create style.css

where as $ express --css sass
will generate style.sass for you and setup the compiler middleware

etc
2010-10-19 17:02:13 -07:00
Tj Holowaychuk 30712fa9d9 Merge branch 'master' into 1.x 2010-10-19 15:03:02 -07:00
Tj Holowaychuk e09bf5cc40 Updated jade submodule 2010-10-19 15:02:56 -07:00
Tj Holowaychuk 129e21e7c3 Regenerate api docs 2010-10-19 10:55:15 -07:00
Tj Holowaychuk 87dcd2909d Doc typo 2010-10-19 10:54:45 -07:00
Tj Holowaychuk e47ec4f551 Doc typo 2010-10-19 10:53:17 -07:00
Tj Holowaychuk d6cfcbe149 Misc doc changes 2010-10-19 09:41:47 -07:00
Tj Holowaychuk 7a713807e9 Merge branch 'is' 2010-10-19 09:34:34 -07:00
Tj Holowaychuk 6e49b5bc30 More req.is() docs for new feature 2010-10-19 09:34:29 -07:00
Tj Holowaychuk adbc5b86f5 Added req.is() wildcard support 2010-10-19 09:30:56 -07:00
Tj Holowaychuk 071ea955af More is() docs 2010-10-19 09:22:11 -07:00
Tj Holowaychuk b817579d8a Merge branch 'master' into 1.x 2010-10-19 09:20:23 -07:00
Tj Holowaychuk 806aefa966 Added req.is() docs 2010-10-19 09:20:16 -07:00
Tj Holowaychuk 5b7d23186d Merge branch 'is' 2010-10-19 09:15:08 -07:00
Tj Holowaychuk 0cb4677e80 Added app.is() to register req.is() assertions 2010-10-19 09:15:02 -07:00
Tj Holowaychuk bd65ecf17b Implemented req.is() 2010-10-19 08:59:06 -07:00
Tj Holowaychuk 9da2adff4c Added tests for req.is() 2010-10-19 08:50:48 -07:00
Tj Holowaychuk a2a1aad109 Updated jade submodule 2010-10-18 08:51:36 -07:00
Tj Holowaychuk dcc530a389 More apps 2010-10-17 10:19:18 -07:00
Tj Holowaychuk 97037a87f3 Fixed nodeko link 2010-10-16 19:21:24 -07:00
Tj Holowaychuk 4e67efc0d6 Merge branch 'apps' 2010-10-16 19:18:38 -07:00
Tj Holowaychuk 7cbb73719e Finished app page (for now) 2010-10-16 19:18:31 -07:00
Tj Holowaychuk d3f139c31e Started apps section 2010-10-16 19:00:33 -07:00
Tj Holowaychuk 8940b6e5a3 Added X-Powered-By, remove Connects "Server" header field
potentially a security issue... I told Tim not to add this :p,
so for now we just hide it in Express until I have a chance to remove
it from Connect, at least the versions.
2010-10-16 18:24:24 -07:00
Tj Holowaychuk 1c9831a9f4 Regenerated docs 2010-10-15 12:51:14 -07:00
Tj Holowaychuk 7da27435cc Doc typo 2010-10-15 12:51:03 -07:00
Tj Holowaychuk bd18f86517 Updated jade submodule 2010-10-15 12:25:40 -07:00
Tj Holowaychuk 41f66b435b Generated app using "view engine" "jade" 2010-10-15 10:17:25 -07:00
Tj Holowaychuk 48481a7230 Docs 2010-10-15 10:12:42 -07:00
Tj Holowaychuk cbcaba3cec Merge branch 'master' into 1.x 2010-10-15 10:02:29 -07:00
Tj Holowaychuk dde6bc1f80 Faster dynamicHelper "merge" 2010-10-15 10:02:02 -07:00
Tj Holowaychuk e39fd1de0e Merge branch 'partials-inherit-locals' 2010-10-15 10:00:08 -07:00
Tj Holowaychuk 2fc9a81e9e Added partial local inheritance [suggested by masylum]. Closes #102 2010-10-15 09:55:04 -07:00
Tj Holowaychuk f65874d751 Added partial inheritance test 2010-10-15 09:40:11 -07:00
Tj Holowaychuk 3914895784 Added http status code string representation to res.redirect() body 2010-10-15 09:20:11 -07:00
Tj Holowaychuk 0bc7e24d0a res.redirect() supporting text/plain and text/html via Accept 2010-10-15 09:13:07 -07:00
Tj Holowaychuk 4e11fef43b Merge branch 'master' into 1.x 2010-10-15 08:26:04 -07:00
Tj Holowaychuk 2a40ceced7 Regenerated docs 2010-10-15 08:25:37 -07:00
Tj Holowaychuk d4868f2cc2 NODE_ENV=production docs, VERY IMPORTANT do this, or your app will be slow :p 2010-10-15 08:25:25 -07:00
Tj Holowaychuk 067fdd5c4c Merge branch 'master' into 1.x 2010-10-14 09:08:19 -07:00
Tj Holowaychuk e87d63779d More partial() docs 2010-10-14 09:08:13 -07:00
Tj Holowaychuk 6672d65018 Deduce partial object names from the last segment
user/role.ejs will use "role" as the object name by default
user.ejs will use "user"
forum/thread/post.jade will use "post"

etc
2010-10-14 08:56:49 -07:00
Tj Holowaychuk 1f78c520f5 Added test for collection option with an object 2010-10-14 08:39:05 -07:00
Tj Holowaychuk 687e435a38 Added CoffeeKup as a suggested template engine (let me know of others please :) ) 2010-10-14 04:21:20 -07:00
Tj Holowaychuk fff815f666 Merge branch 'master' into 1.x 2010-10-14 04:17:19 -07:00
Tj Holowaychuk b3222dc107 fixed bin/express 2010-10-14 04:17:15 -07:00
Tj Holowaychuk ebba6caa3d 2 spaces in bin/express 2010-10-14 04:15:44 -07:00
Tj Holowaychuk 88bbef9003 Merge branch 'indentation' 2010-10-14 04:07:37 -07:00
Tj Holowaychuk 712771a139 2 spaces in view.js 2010-10-14 04:07:29 -07:00
Tj Holowaychuk 9033b0ded7 2 spaces in utils.js 2010-10-14 04:02:23 -07:00
Tj Holowaychuk 877cfe9393 2 spaces in server.js 2010-10-14 04:01:35 -07:00
Tj Holowaychuk 347aa56acb 2 spaces in response.js 2010-10-14 03:58:44 -07:00
Tj Holowaychuk 0fc410139c 2 spaces in request.js 2010-10-14 03:54:26 -07:00
Tj Holowaychuk 609c18aa5b Merge branch 'master' into 1.x 2010-10-14 03:50:56 -07:00
Tj Holowaychuk 51528235db Regenerated docs 2010-10-14 03:50:33 -07:00
Tj Holowaychuk 003599cbda Release 1.0.0rc4 2010-10-14 03:50:10 -07:00
Tj Holowaychuk bacfad37a9 Updated connect submodule 2010-10-14 03:41:41 -07:00
Tj Holowaychuk 73c108ce90 Merge branch 'master' into 1.x 2010-10-14 03:03:24 -07:00
Tj Holowaychuk 6ef6ba7b8a Fix up app.register() docs. Closes #450
thank ya
2010-10-14 03:03:18 -07:00
Tj Holowaychuk 1e9da205a7 Merge branch 'master' into 1.x 2010-10-12 12:59:14 -07:00
Dav Glass 93c0da0367 Added tests for enable/disable of settings 2010-10-12 12:58:59 -07:00
Dav Glass 268d19e8a3 Added config option app.enable('jsonp callback') support 2010-10-12 12:58:59 -07:00
Dav Glass a383b302c2 Added callback query check on response.send to autowrap JSON objects for simple webservice implementations 2010-10-12 12:58:59 -07:00
Tj Holowaychuk 95ebbf2608 Updated jade submodule 2010-10-12 11:27:41 -07:00
Tj Holowaychuk f880574c78 Example typo 2010-10-12 10:09:20 -07:00
Tj Holowaychuk 350c310906 Fixed test typo 2010-10-12 09:49:15 -07:00
Tj Holowaychuk 5026f7686e Updated connect submodule 2010-10-12 09:48:49 -07:00
Tj Holowaychuk d5539c7beb Merge branch 'master' into 1.x 2010-10-12 08:46:48 -07:00
Tj Holowaychuk ab3337ddf5 Regenerated guide 2010-10-12 08:46:22 -07:00
Tj Holowaychuk c9268f2e3d Doc typo 2010-10-12 08:46:05 -07:00
Tj Holowaychuk fa01388f97 Updated connect-form submodule 2010-10-12 08:30:36 -07:00
Tj Holowaychuk d8dc89ac7b Updated jade submodule 2010-10-12 08:29:59 -07:00
Tj Holowaychuk f87bd8c38f Merge branch 'master' into 1.x 2010-10-11 08:37:49 -07:00
Tj Holowaychuk a659fd1fa9 Added partial() support for array-like collections. Closes #434 2010-10-11 08:37:42 -07:00
Tj Holowaychuk 05515fa09e Merge branch 'master' into 1.x 2010-10-11 08:18:01 -07:00
Tj Holowaychuk 27fa3ba34c Default env to "development" again [thanks aheckmann] 2010-10-11 08:17:52 -07:00
Tj Holowaychuk 35c91ed6f5 Merge branch 'master' into 1.x 2010-10-08 11:39:14 -07:00
Tj Holowaychuk 663f42948e Added support for swappable querystring parsers 2010-10-08 11:38:59 -07:00
Tj Holowaychuk baca8f0cdb Added guillermo to package.json contrib 2010-10-07 06:50:29 -07:00
Tj Holowaychuk c5c3a82b23 Removed another sys require 2010-10-07 06:45:48 -07:00
Tj Holowaychuk c0617864e1 Removed sys require 2010-10-07 06:45:14 -07:00
Tj Holowaychuk 26238c429d Merge branch 'master' into 1.x 2010-10-07 06:35:27 -07:00
Tj Holowaychuk d9ef9ab497 Merge branch 'perf/cache-dynamicHelpers' 2010-10-07 06:34:49 -07:00
Tj Holowaychuk 65d9f783e1 Added test for dynamic helper cache 2010-10-07 06:32:35 -07:00
Tj Holowaychuk f70232d1b0 Implemented dynamic helper cache. Closes #439 2010-10-07 06:29:58 -07:00
Tj Holowaychuk b083aed245 Doc cleanup 2010-10-07 05:57:27 -07:00
Tj Holowaychuk 0faac20d53 Regenerated docs 2010-10-07 05:53:14 -07:00
Tj Holowaychuk cef14ca7cd Fixed docs 2010-10-07 05:53:02 -07:00
Tj Holowaychuk 090debe0df Regenerated docs 2010-10-07 05:49:35 -07:00
Tj Holowaychuk 296f1270ee Ordering docs 2010-10-07 05:49:19 -07:00
Tj Holowaychuk 1b28ad16d4 Merge branch 'master' into 1.x 2010-10-07 05:46:45 -07:00
Tj Holowaychuk 334a18a114 Regenerated docs 2010-10-07 05:46:39 -07:00
Tj Holowaychuk dd4ddae082 Added route middleware docs 2010-10-07 05:46:26 -07:00
Tj Holowaychuk 4983e967bc Added route-middleware example 2010-10-07 05:28:09 -07:00
Tj Holowaychuk 0b5e2f14ed Updated ejs submodule 2010-10-07 04:28:11 -07:00
Tj Holowaychuk 70102aecb5 Fixed mvc example 2010-10-07 04:15:34 -07:00
Tj Holowaychuk e29f3aa5dd Merge branch 'master' into 1.x 2010-10-07 03:50:02 -07:00
Tj Holowaychuk ae75153561 Merge branch 'features/route-middleware' 2010-10-07 03:49:58 -07:00
Tj Holowaychuk dd23d60513 Recursively apply route middleware 2010-10-07 03:49:38 -07:00
Tj Holowaychuk db95481b76 Added another route middleware test 2010-10-07 03:46:20 -07:00
Tj Holowaychuk 3e0da535b9 Implemented route middleware with arrays 2010-10-07 03:45:23 -07:00
Tj Holowaychuk c74602551e Added test for multiple route middleware 2010-10-07 03:40:54 -07:00
Tj Holowaychuk 1722e2c7a5 Implemented route middleware support 2010-10-07 03:30:39 -07:00
Tj Holowaychuk 8a845e2951 Auth example using route middleware 2010-10-07 03:21:07 -07:00
Tj Holowaychuk 72765bada0 Typo in auth example 2010-10-07 03:16:40 -07:00
Tj Holowaychuk 5c94603787 Merge branch 'master' into 1.x 2010-10-07 02:36:41 -07:00
Tj Holowaychuk b380f180cc Links 2010-10-07 02:36:34 -07:00
Tj Holowaychuk 9409107f77 Merge branch 'master' into 1.x 2010-10-06 08:26:29 -07:00
Tj Holowaychuk f1799799a1 Regenerated guide 2010-10-06 08:26:01 -07:00
Tj Holowaychuk 4bc8a8673d More session docs 2010-10-06 08:25:49 -07:00
Tj Holowaychuk 7f11aa25ea Merge branch 'master' into 1.x 2010-10-05 06:32:50 -07:00
Tj Holowaychuk cbdd907393 Added logger to pages example 2010-10-05 06:31:21 -07:00
Tj Holowaychuk aa7ff3ef47 typo 2010-10-05 06:27:17 -07:00
Tj Holowaychuk ebdf6434eb Fixing up examples a bit 2010-10-05 06:14:19 -07:00
Tj Holowaychuk 9b7470d204 Exposing ./support libs to examples 2010-10-05 06:08:53 -07:00
Tj Holowaychuk 9f3ab8683c Added log lines to more examples 2010-10-05 06:01:26 -07:00
Tj Holowaychuk fa464aca90 Updated jade submodule 2010-10-05 05:56:42 -07:00
Tj Holowaychuk 2724ce368a Rebuilt docs 2010-10-04 11:17:29 -07:00
Tj Holowaychuk 1994f24d82 Merge branch 'master' into 1.x 2010-10-04 11:16:56 -07:00
Tj Holowaychuk 89f7cbe877 Added session usage docs. Closes #443 2010-10-04 11:16:46 -07:00
Tj Holowaychuk b5b30a3f20 Merge branch 'master' into 1.x 2010-10-04 11:06:33 -07:00
Tj Holowaychuk fab9af2206 Merge branch 'range' 2010-10-04 11:06:15 -07:00
Tj Holowaychuk 4d01b4fa59 Handling invalid ranges 2010-10-04 08:36:57 -07:00
Tj Holowaychuk c3365aa37e Merge branch 'master' into range 2010-10-04 08:14:30 -07:00
Tj Holowaychuk 4fcbb961eb Merge branch 'master' into 1.x 2010-10-04 08:04:12 -07:00
Tj Holowaychuk 426e80d4c3 Updated jade submodule 2010-10-04 08:04:00 -07:00
Tj Holowaychuk 30a282d126 Updated connect submodule 2010-10-04 08:03:51 -07:00
Tj Holowaychuk 11cfad755a Merge branch 'master' into 1.x 2010-10-04 08:01:30 -07:00
Tj Holowaychuk 0a96621e3e Docs for layout option 2010-10-04 08:01:17 -07:00
Tj Holowaychuk 0b24bd08c9 Merge branch 'master' into 1.x 2010-10-01 16:33:34 -07:00
Tj Holowaychuk d9d30abe7a Updated docs to use NODE_ENV 2010-10-01 16:33:27 -07:00
Tj Holowaychuk b377839538 Merge branch 'master' into 1.x 2010-10-01 16:31:40 -07:00
Tj Holowaychuk 03b56d8140 Implement NODE_ENV, EXPRESS_ENV is now deprecated
spark, connect, and express will from now on utilize NODE_ENV.
EXPRESS_ENV support will remain until 1.0
2010-10-01 16:31:32 -07:00
Tj Holowaychuk 1f79ce4e96 Updated connect submodule 2010-10-01 16:26:09 -07:00
Tj Holowaychuk 8d80f23a0f antialiased text 2010-10-01 07:53:56 -07:00
Tj Holowaychuk d89b951451 HTTP verb docs. Closes #415 2010-10-01 07:51:19 -07:00
Tj Holowaychuk 698d82f799 Merge branch 'master' into 1.x 2010-10-01 07:34:14 -07:00
Tj Holowaychuk 1906a38ec8 express(1) app using 2 spaces instead of 4 2010-09-26 08:24:48 -07:00
Tj Holowaychuk 462a291eb8 Merge branch 'master' into 1.x 2010-09-23 09:37:05 -07:00
Tj Holowaychuk 8d91a3e3b8 Updated jade submodule 2010-09-23 09:24:56 -07:00
Tj Holowaychuk 3324259977 Updated connect submodule 2010-09-23 09:24:52 -07:00
Tj Holowaychuk 79dc2467f7 Merge branch 'master' into 1.x 2010-09-22 16:09:15 -07:00
Tj Holowaychuk ec2db2d541 Fixed mvc example listen() call 2010-09-22 16:08:38 -07:00
Tj Holowaychuk 0a0c86813d Merge branch 'master' into 1.x 2010-09-22 12:03:42 -07:00
Tj Holowaychuk 5cf248c7f3 Merge branch 'auth-example' 2010-09-22 12:03:28 -07:00
Tj Holowaychuk 3876a566ff Added authentication example
very raw and minimal but gives people and idea
2010-09-22 12:03:18 -07:00
Tj Holowaychuk 334e6cc618 Started auth example 2010-09-22 10:36:15 -07:00
Tj Holowaychuk 64033fcfc2 Extended utils.parseRange() 2010-09-22 09:34:05 -07:00
Tj Holowaychuk fbe3af4719 Added utils.parseRange() tests 2010-09-22 09:29:25 -07:00
Tj Holowaychuk 699ed4ee85 Started naive Range support 2010-09-22 09:06:11 -07:00
Tj Holowaychuk 903f67a154 Started utils.parseRange() 2010-09-22 08:48:22 -07:00
Tj Holowaychuk 9a89dab9e0 Added Range test 2010-09-22 08:41:20 -07:00
Tj Holowaychuk 435a2565b8 Added Accept-Ranges: bytes 2010-09-22 08:29:48 -07:00
Tj Holowaychuk 8267b8da57 Added res.sendfile() Accept-Ranges test 2010-09-22 08:29:22 -07:00
Tj Holowaychuk dfdc939816 Multipart typo 2010-09-21 12:39:14 -07:00
Tj Holowaychuk 8b5773c246 Multipart typo 2010-09-21 12:38:42 -07:00
Tj Holowaychuk fd4c88d202 Updated docs 2010-09-21 09:21:11 -07:00
Tj Holowaychuk 9b26623aa5 View scope now defaults to the request
No longer the response, as this is more useful for obtaining urls etc
2010-09-21 09:20:04 -07:00
Tj Holowaychuk b115ec7c14 "context" option is no more, use "scope" 2010-09-21 09:18:22 -07:00
Tj Holowaychuk a2e6e2a06a Pass true for res.sendfile() callback when streamed
This is potentially useful since we can no longer
respond, however with readFile() we can respond with a 500
page or similar
2010-09-21 08:51:07 -07:00
Tj Holowaychuk f0eab06a8b Updated docs 2010-09-20 09:54:01 -07:00
Tj Holowaychuk b6c839d693 Release 1.0.0rc3 2010-09-20 09:50:38 -07:00
Tj Holowaychuk 177a724d58 res.sendfile() responding with 403 on malicious path 2010-09-20 09:16:01 -07:00
Tj Holowaychuk 949803dcf6 Merge branch 'downloads' 2010-09-20 09:06:46 -07:00
Tj Holowaychuk b763a88e60 Docs for "stream threshold" setting 2010-09-20 09:06:43 -07:00
Tj Holowaychuk 18c7f164a8 res.sendfile() using sys.pump() when >= "stream threshold" 2010-09-20 08:41:08 -07:00
Tj Holowaychuk e037ff6bba Added Content-Length assertion for res.sendfile() 2010-09-20 08:23:16 -07:00
Tj Holowaychuk 95bfda1ff0 res.sendfile() using fs.stat() 2010-09-20 08:19:21 -07:00
Tj Holowaychuk b9992e0b45 Refactored res.sendfile() 2010-09-20 08:18:38 -07:00
Tj Holowaychuk f6ba793885 Merge branch 'download-example' 2010-09-18 10:25:05 -07:00
Tj Holowaychuk bbe65a8ea3 Fixed res.download() bug; when an error occurs remove Content-Disposition
Previously if you tried to show a 404 page (or similar)
on a failed res.download(), the browser would still prompt for download
2010-09-18 10:25:00 -07:00
Tj Holowaychuk 20af7371d0 Added download example 2010-09-18 10:21:37 -07:00
Tj Holowaychuk a33fb0c439 Added widescript link 2010-09-14 15:56:21 -07:00
Tj Holowaychuk 87003c8b5b Fixed tests for node --version 0.2.1 2010-09-14 08:18:13 -07:00
Tj Holowaychuk ddd48ee79f Added LICENSE as requested by davglass 2010-09-14 07:59:30 -07:00
Tj Holowaychuk a9819df3ee res.send() HEAD support 2010-09-13 12:05:28 -07:00
Tj Holowaychuk 15dffb22aa Updated connect submodule 2010-09-13 11:58:49 -07:00
Tj Holowaychuk 6ef5f1ff62 Merge branch 'integration' 2010-09-13 11:24:33 -07:00
Tj Holowaychuk acc28c68a4 Refactored app.set() 2010-09-13 11:24:20 -07:00
Aaron Heckmann 6c2da60eb0 add test for inherited mounted app settings 2010-09-13 11:20:49 -07:00
Aaron Heckmann 490081077d mounted apps settings now inherited from parent app 2010-09-13 11:20:49 -07:00
Tj Holowaychuk f4a08092da Merge branch 'guide' 2010-09-13 11:14:55 -07:00
Tj Holowaychuk 0116efd4a3 Removed manpage crap from site 2010-09-13 11:14:41 -07:00
Tj Holowaychuk 9719a24f8a Toggling menus 2010-09-13 11:11:47 -07:00
Tj Holowaychuk 3a7d5a099b TOC sections 2010-09-13 11:03:17 -07:00
Tj Holowaychuk 27dba655fc Uncommented cookie assertions previously failing 2010-09-13 10:11:28 -07:00
Tj Holowaychuk a25dd387bf Refactored res.redirect() 2010-09-13 10:10:03 -07:00
Tj Holowaychuk a89767cc16 Cookie docs 2010-09-13 09:52:33 -07:00
Tj Holowaychuk a13df5b68d Added test for res.clearCookie() 2010-09-13 09:44:42 -07:00
Tj Holowaychuk 6a689504ff Fixed res.cookie() test 2010-09-13 09:44:02 -07:00
Tj Holowaychuk 6521d2bcfb Merge branch 'features/cookie' 2010-09-13 09:43:37 -07:00
Tj Holowaychuk 26d55b15de Added cookies example 2010-09-13 09:43:13 -07:00
Tj Holowaychuk 041b7e8a29 Added res.cookie() and res.clearCookie() 2010-09-13 09:43:07 -07:00
Tj Holowaychuk 6eeb425e7a Updated jade submodule 2010-09-11 13:09:39 -07:00
Tj Holowaychuk d2d0eb829e Updated jade submodule 2010-09-10 13:19:14 -07:00
Tj Holowaychuk 058505b664 Updated connect submodule 2010-09-10 13:19:11 -07:00
Tj Holowaychuk 8adecedb40 Added test to confirm view helper usage w/ ejs 2010-09-08 10:49:29 -07:00
Tj Holowaychuk 838a51db21 Merge branch 'master' of github.com:visionmedia/express 2010-09-06 14:06:50 -07:00
Tj Holowaychuk 4d4dfc27fc Updated connect submodule 2010-09-06 14:06:35 -07:00
Tj Holowaychuk 1444439cf3 Wiki 2010-09-06 11:37:48 -07:00
Tj Holowaychuk e64fc8d5ab node dep 2010-09-06 11:03:33 -07:00
Tj Holowaychuk 9a31f772d9 Added contrib link 2010-09-06 10:59:56 -07:00
Tj Holowaychuk 12876ee4ce Added res.send() as 204 in the guide 2010-09-06 10:15:32 -07:00
Tj Holowaychuk a4a349da45 Stripping Content-Length / Content-Type when 204 2010-09-06 10:10:59 -07:00
Tj Holowaychuk ecbc3cae71 res.send() as 204. Closes #419 2010-09-06 10:05:39 -07:00
Tj Holowaychuk 57609c87fb Merge branch 'features/render-status' 2010-09-06 09:44:46 -07:00
Tj Holowaychuk bb2e24e028 Added docs for render() status / headers 2010-09-06 09:44:32 -07:00
Tj Holowaychuk 5cafb26e93 Fixed pages example w/ render() status 2010-09-06 09:43:17 -07:00
Tj Holowaychuk f74ef7b293 Added render() headers option 2010-09-06 09:42:00 -07:00
Tj Holowaychuk 7ef8f531e7 Added render() status option support. Closes #425 2010-09-06 09:38:23 -07:00
Tj Holowaychuk afb65c7b19 Added render() status test 2010-09-06 09:36:22 -07:00
Tj Holowaychuk 74a0673663 Better app.helper() test 2010-09-06 09:11:27 -07:00
Tj Holowaychuk 20fae6e512 Updated jade submodule 2010-09-02 17:08:08 -07:00
Tj Holowaychuk 509cd242f7 Updated connect submodule 2010-09-02 17:06:50 -07:00
Tj Holowaychuk f01ec516eb Updated connect submodule 2010-09-02 09:50:04 -07:00
Tj Holowaychuk 394b1000d2 Updated ejs submodule 2010-08-30 17:46:16 -07:00
Tj Holowaychuk e0b9fba788 Updated jade submodule 2010-08-30 17:46:13 -07:00
Tj Holowaychuk 378ee29cc2 Updated connect submodule 2010-08-30 16:14:06 -07:00
Tj Holowaychuk 02bcef71dd Updated jade submodule 2010-08-27 13:47:48 -07:00
Tj Holowaychuk 248e7c8003 Updated connect submodule 2010-08-27 13:47:41 -07:00
Tj Holowaychuk a2e93ebd56 Fixed Connect links 2010-08-27 12:40:33 -07:00
Tj Holowaychuk 21a9454de1 Merge branch 'confirmation' 2010-08-27 12:38:23 -07:00
Tj Holowaychuk ec286eed08 Added confirmation for express(1) app generation. Closes #391 2010-08-27 12:38:19 -07:00
Tj Holowaychuk f16978d1fe Added flash formatter docs 2010-08-27 12:17:57 -07:00
Tj Holowaychuk fa3adc7606 Merge branch 'flash-formatting' 2010-08-27 12:15:23 -07:00
Tj Holowaychuk 192144fc5d Added extending of flash formatters via app.flashFormatters 2010-08-27 12:15:18 -07:00
Tj Holowaychuk a4d155c5e4 Added flash formatter support. Closes #411 2010-08-27 12:09:55 -07:00
Tj Holowaychuk 6c56e9d199 Added failing assertion for flash formatters 2010-08-27 11:59:29 -07:00
Tj Holowaychuk bb18f87a98 Merge branch 'fix-toc' 2010-08-27 10:13:13 -07:00
Tj Holowaychuk dda6a31381 Fixed TOC. Closes #404 [thanks weaver] 2010-08-27 10:13:08 -07:00
Tj Holowaychuk 6e25e18e98 express(1) now outputting listening msg, and express.MIDDLEWARE vs connect.MIDDLWARE 2010-08-24 13:52:26 -07:00
Tj Holowaychuk ffd978c24f Updated node --version support 2010-08-24 13:35:40 -07:00
Tj Holowaychuk 4c4af03a5a Doc typos 2010-08-24 13:22:52 -07:00
Tj Holowaychuk c0739bb8b7 Fixed bug messing with error handlers when listenFD() is called instead of listen(). [thanks guillermo]
programs such as "spark" call listenFD() to call listen(1) with
a file descriptor, BUT Express was only proxying listen()
to register these handlers. Thanks for catching this bug guillermo!
2010-08-24 13:21:28 -07:00
Tj Holowaychuk 5add7cb0b1 Merge branch 'mvc' 2010-08-24 13:06:53 -07:00
Tj Holowaychuk 99f49f1061 Fixed MVC 500 error example 2010-08-24 13:06:50 -07:00
Tj Holowaychuk 401eaca9ab Mvc example typo 2010-08-24 12:58:30 -07:00
Tj Holowaychuk da784fe02b Added 500 page to mvc example 2010-08-24 12:56:34 -07:00
Tj Holowaychuk d507b29559 Added .json format support to the mvc example 2010-08-24 12:10:29 -07:00
Tj Holowaychuk 35ca13b38d Merge branch 'form' 2010-08-24 10:49:56 -07:00
Tj Holowaychuk 04b92a31a8 Added keepExtensions: true to multipart example 2010-08-24 10:49:52 -07:00
Tj Holowaychuk dd311d759d Better 404 Not Found example 2010-08-20 21:39:35 -07:00
Tj Holowaychuk b504ca9f0a Merged mvc example. Closes #405 2010-08-20 18:09:56 -07:00
Tj Holowaychuk bd61c5c721 Fixed hasMessages dynamic helper 2010-08-20 18:04:01 -07:00
Tj Holowaychuk 24694b0047 mvc styling 2010-08-20 18:03:12 -07:00
Tj Holowaychuk 5258154285 Added 404 page to mvc example 2010-08-20 17:58:29 -07:00
Tj Holowaychuk 221f993b46 Misc refactoring of mvc example 2010-08-20 17:53:55 -07:00
Tj Holowaychuk ae5ea70b93 Editing of email for mvc example as well 2010-08-20 17:29:01 -07:00
Tj Holowaychuk f59ffbeb63 Implemented simple user editing 2010-08-20 17:27:21 -07:00
Tj Holowaychuk ce55275634 ejs parsing *.html for mvc example 2010-08-20 17:11:30 -07:00
Tj Holowaychuk 20c5892f9a More work on mvc example 2010-08-20 17:08:10 -07:00
Tj Holowaychuk 9231245a3f Started mvc example 2010-08-20 16:50:23 -07:00
Tj Holowaychuk cbfed20e6f Updated ejs submodule 2010-08-20 16:23:49 -07:00
Tj Holowaychuk 640274ed52 Merge branch 'redirect-bodies' 2010-08-20 12:30:06 -07:00
Tj Holowaychuk 1507a39a2b res.redirect() using res.send()
Allows for setting of arbitrary headers via res.header()
2010-08-20 12:21:29 -07:00
Tj Holowaychuk e6405653d8 Added res.redirect() Content-Type of text/plain for now 2010-08-20 12:19:08 -07:00
Tj Holowaychuk be1541a646 Added res.redirect() response bodies 2010-08-20 12:17:52 -07:00
Tj Holowaychuk f37f9bf5e3 Updated connect submodule 2010-08-20 08:42:18 -07:00
Tj Holowaychuk a5c39ca8c8 Merge branch 'set-cookie' 2010-08-20 08:41:10 -07:00
Tj Holowaychuk cb7e7b2a74 Pass res.send() headers through res.header() 2010-08-20 08:41:06 -07:00
Tj Holowaychuk 2e8e705bab Fixed multiple Set-Cookie headers via res.header(). Closes #402 2010-08-20 08:29:21 -07:00
Tj Holowaychuk ab3812432b Updated expresso submodule 2010-08-19 11:44:42 -07:00
Tj Holowaychuk d2acb36e3b Updated connect submodule 2010-08-19 11:44:40 -07:00
Tj Holowaychuk 601743ff7a Added boilerplate example 2010-08-18 17:41:06 -07:00
Tj Holowaychuk 7eca74ac05 Updated node --version in readme 2010-08-17 16:45:42 -07:00
Tj Holowaychuk 02b4ec04bb Doc typos 2010-08-17 16:08:02 -07:00
Tj Holowaychuk 8ead9014d0 Regenerated docs again 2010-08-17 13:15:54 -07:00
Tj Holowaychuk 4920e82dd6 Regenerated docs 2010-08-17 13:12:21 -07:00
Tj Holowaychuk 3150253661 Release 1.0.0rc2 2010-08-17 13:09:17 -07:00
Tj Holowaychuk baa423b45a Updated connect submodule 2010-08-16 13:49:33 -07:00
Tj Holowaychuk 77e5d8ea96 Added app.register() docs 2010-08-15 10:20:33 -07:00
Tj Holowaychuk 9a8166d649 Added app.register() for template engine mapping. Closes #390
This is not exactly what you requested, but
I think this is a better approach. With old Express
I used to have "foo.ejs.html" "foo.haml.html" etc,
but that is super verbose.

This will allow for non-authors to support non-compliant
engines without modifying the original module, as well
as having things like .html render with jade
2010-08-15 10:13:47 -07:00
Tj Holowaychuk da8c0cd2db Removed clearCache()
its useless ATM
2010-08-15 09:54:51 -07:00
Tj Holowaychuk fc2711b543 Fixed bug with undefined path 2010-08-12 14:57:36 -07:00
Tj Holowaychuk b4327bd36c Merge branch 'render-callback' 2010-08-11 16:29:10 -07:00
Tj Holowaychuk f7f75923aa Added res.render() callback support as second argument
This previously was not valid:

    res.render(foo, function(){});
2010-08-11 16:28:24 -07:00
Tj Holowaychuk 0b4388bc5b Added test to confirm res.render() callback with layouts 2010-08-11 16:25:31 -07:00
Tj Holowaychuk f08883071f Updated app list 2010-08-11 10:11:20 -07:00
Tj Holowaychuk bb8a2ee3a6 Updated expresso submodule 2010-08-11 09:32:59 -07:00
Tj Holowaychuk 6bfa7595d8 Added callback support to res.download() 2010-08-09 16:11:00 -07:00
Tj Holowaychuk 8308e501cd Fixed res.sendfile() error handling, defer via next()
No need to be so specific here.
2010-08-09 16:04:41 -07:00
Tj Holowaychuk 25909c0d9d Added callback support for res.sendfile() 2010-08-09 16:00:23 -07:00
Tj Holowaychuk 2844b1ac38 Fixed test labels 2010-08-09 15:57:27 -07:00
Tj Holowaychuk 6fd62b1cee No need to pass params in app.redirect() 2010-08-09 09:19:44 -07:00
Tj Holowaychuk 1579f53a61 Updated connect submodule 2010-08-09 08:50:33 -07:00
Tj Holowaychuk 7af7851952 Fixed res.download() test 2010-08-09 08:06:01 -07:00
Tj Holowaychuk 5dbd1a6dcc Merge branch 'format-example' 2010-08-09 08:03:00 -07:00
Tj Holowaychuk 24881537a1 Fixed format example 2010-08-09 08:02:38 -07:00
Tj Holowaychuk 631c29b26b Updated connect submodule 2010-08-09 07:57:45 -07:00
Tj Holowaychuk ab249d4032 Added format example 2010-08-09 07:46:29 -07:00
Tj Holowaychuk 5bfa3f6274 Merge branch 'helper-precedence' 2010-08-09 07:32:20 -07:00
Tj Holowaychuk 82ee25dfaa Added test helper local precedence test 2010-08-09 07:32:12 -07:00
Tj Holowaychuk fd9a24553f Added another dynamicHelper example to flash example 2010-08-09 07:22:33 -07:00
Tj Holowaychuk ae1c20fad9 Fixed flash example. Closes #392 2010-08-09 07:19:55 -07:00
Tj Holowaychuk 734f777ff9 Added failing test for view helper precedence 2010-08-06 16:13:21 -07:00
Tj Holowaychuk 498115d5d9 Merge branch 'fix-error' 2010-08-06 09:04:08 -07:00
Tj Holowaychuk 033ff06b68 More app.error() docs 2010-08-06 09:04:04 -07:00
Tj Holowaychuk c145a8e1a1 Changed "pages" example to show error() handlers defined above routes 2010-08-06 09:01:09 -07:00
Tj Holowaychuk ae5b0dbc29 Fixed issue preventing error handlers from being defined anywhere. Closes #387
Now we can define them in configure() callbacks etc
2010-08-06 08:59:16 -07:00
Tj Holowaychuk 95aa957c80 Altered app.error() tests to reflect issue #387 2010-08-06 08:48:17 -07:00
Tj Holowaychuk 7dff9ddeeb Merge branch 'flash-example' 2010-08-05 17:12:33 -07:00
Tj Holowaychuk b4e755747f Fixed dynamic helper in flash example 2010-08-05 17:12:18 -07:00
Tj Holowaychuk 348fa402be Started flash example 2010-08-05 16:51:07 -07:00
Tj Holowaychuk 344218ff3d Updated docs 2010-08-05 16:19:06 -07:00
Tj Holowaychuk 90a1a2febf Updated examples to use express.<middleware> 2010-08-05 16:10:22 -07:00
Tj Holowaychuk e234a24894 Re-exporting connect middleware auto-loaders 2010-08-05 15:56:33 -07:00
Tj Holowaychuk d9beb75bd6 Updated connect submodule 2010-08-05 15:51:27 -07:00
Tj Holowaychuk dadea8c83d Merge branch 'fix-layouts' 2010-08-05 13:57:02 -07:00
Tj Holowaychuk 31d40e5509 Updated connect submodule 2010-08-05 13:32:22 -07:00
Tj Holowaychuk a917e84b51 Fixed latest test 2010-08-05 11:59:58 -07:00
Tj Holowaychuk f30b497206 Added failing layout test 2010-08-05 11:47:35 -07:00
Tj Holowaychuk 706e32c20b Merge branch 'app-level-view-options' 2010-08-05 09:46:03 -07:00
Tj Holowaychuk 4d98552c37 Docs for "view options" 2010-08-05 09:45:56 -07:00
Tj Holowaychuk 5311bd3f4e Added app level view options
via the "view options" setting
2010-08-05 09:41:26 -07:00
Tj Holowaychuk 8d716fb7ba Added test for "view options" setting 2010-08-05 09:31:14 -07:00
Tj Holowaychuk 01b3caaf49 Updated ejs submodule 2010-08-05 09:21:47 -07:00
Tj Holowaychuk cd73c0b9ca Updated expresso submodule 2010-08-05 08:48:25 -07:00
Tj Holowaychuk 7ec5230402 make install-docs creating PREFIX/share/man/man1 when not present 2010-08-04 09:45:16 -07:00
Tj Holowaychuk 9dbe026f83 make install creating ~/.node_libraries when not present 2010-08-04 09:43:58 -07:00
Tj Holowaychuk 3fae10da3e Merge branch 'integration' 2010-08-04 09:13:25 -07:00
Tj Holowaychuk d775154b92 Added "partials" setting to docs 2010-08-04 09:13:21 -07:00
Tj Holowaychuk 6c306b3542 Fixed "partials" setting 2010-08-04 09:10:58 -07:00
Nick Poulden 58b46ffeac Optionally set partials directory 2010-08-04 09:04:50 -07:00
Tj Holowaychuk 0bb7b7c60e Updated connect submodule 2010-08-04 08:35:16 -07:00
Tj Holowaychuk 58adf9a385 Updated jade submodule 2010-08-04 08:33:18 -07:00
Tj Holowaychuk d6ba968ace Updated expresso 2010-08-04 07:56:26 -07:00
Tj Holowaychuk 1706721a62 Updated ejs 2010-08-04 07:56:11 -07:00
Tj Holowaychuk 7f88bd2eaf Added isLayout property
Aid introspection for another project I am working on
2010-08-03 15:52:20 -07:00
Tj Holowaychuk b819366265 Updated docs 2010-08-03 14:53:35 -07:00
Tj Holowaychuk 47ff7d9dba Fixed doc typo 2010-08-03 14:53:31 -07:00
Tj Holowaychuk e5f5254877 Added default expresso tests to express(1) generated app. Closes #384 2010-08-03 09:57:24 -07:00
Tj Holowaychuk 4778f728f9 Updated ejs submodule 2010-08-02 10:37:03 -07:00
Tj Holowaychuk e80e4573be Updated jade submodule 2010-08-02 09:04:50 -07:00
Tj Holowaychuk fdf0f3f282 Fixed multipart app example 2010-08-02 07:35:38 -07:00
Tj Holowaychuk a81fce47d0 Updated docs 2010-07-31 07:18:35 -07:00
Tj Holowaychuk 2cd6989b11 Fixed some inline comments 2010-07-31 07:18:29 -07:00
Tj Holowaychuk 21abb0d205 Fixed readme version of node 2010-07-30 18:09:51 -07:00
Tj Holowaychuk 5e1a271ca2 Fixed res.render() callback when a layout is used [thanks guillermo] 2010-07-30 16:52:35 -07:00
Tj Holowaychuk 868e4c41e1 Added storify link 2010-07-30 12:51:50 -07:00
Tj Holowaychuk a6e23bb713 Fixed connect dependency version 2010-07-30 10:50:54 -07:00
Tj Holowaychuk 446406dd62 Removed --growl from make test 2010-07-30 10:47:00 -07:00
Tj Holowaychuk 091f9f7eae Test typo 2010-07-30 10:45:35 -07:00
Tj Holowaychuk 10b1e06263 Updated docs 2010-07-30 10:41:12 -07:00
Tj Holowaychuk a8865a51fd Misc docs 2010-07-30 10:29:58 -07:00
Tj Holowaychuk 32343297fc Updated docs 2010-07-30 10:21:33 -07:00
Tj Holowaychuk aaa5deb0c0 Release 1.0.0rc 2010-07-30 10:16:30 -07:00
Tj Holowaychuk 808c519a1f Added doc contrib .. docs :) 2010-07-28 12:48:41 -07:00
Tj Holowaychuk 262b110f9f Removed "reload views" setting and support code
development env will always bypass cache,
however production will not
2010-07-28 11:22:29 -07:00
Tj Holowaychuk d0fe19f996 Added e-resistible.co.uk link 2010-07-28 09:39:29 -07:00
Tj Holowaychuk 8e6675677f Removed direct CONNECT_ENV support
it is now SPARK_ENV, grr tim
2010-07-28 08:55:13 -07:00
Tj Holowaychuk 82dbae6185 Check CONNECT_ENV before connectEnv.name 2010-07-28 08:52:49 -07:00
Aaron Heckmann 943f1df325 typo 2010-07-28 08:27:51 -07:00
Tj Holowaychuk 018abcfe5f Added jade submodule back. Closes #376
This should work hopefully,
not sure what happened there probably
because I forced a push yesterday
2010-07-28 08:25:33 -07:00
Tj Holowaychuk 6b4f716508 Removed jade 2010-07-28 08:24:46 -07:00
Tj Holowaychuk 82b6ff0c28 Added http://clickdummy.net/ link 2010-07-27 15:33:35 -07:00
Tj Holowaychuk d0c3132a63 Updated jade submodule 2010-07-27 14:23:22 -07:00
Tj Holowaychuk 02f0252dea Added http://codeshelver.com/ link 2010-07-27 12:23:21 -07:00
Tj Holowaychuk 74b3921eee Undocumented cache option
Dont pass this manually,
production mode sets cache to true
2010-07-27 12:14:57 -07:00
Tj Holowaychuk 1695c79021 Added wtfjs.com 2010-07-27 10:06:09 -07:00
Tj Holowaychuk a3b0534b86 Updated docs 2010-07-27 10:03:52 -07:00
Tj Holowaychuk a13f94d40f Updated node news url 2010-07-27 09:42:16 -07:00
Tj Holowaychuk 73288420a8 Added "Apps using express" section, PM me to add to the list 2010-07-27 09:30:27 -07:00
Tj Holowaychuk e224387eb4 Misc refactoring 2010-07-27 09:08:40 -07:00
Tj Holowaychuk 626d322639 < 78 cols in view.js so people stop complaining :D 2010-07-27 09:07:37 -07:00
Tj Holowaychuk 7dce7a84c7 Added connect to package.json 2010-07-27 08:10:33 -07:00
Tj Holowaychuk 6234268f10 Updated docs 2010-07-26 17:02:31 -07:00
Tj Holowaychuk 7a1525c568 Defaulting app.enable("reload views") to 500ms 2010-07-26 17:01:08 -07:00
Tj Holowaychuk fe99eb7147 Fixed a dynamic helper assertion 2010-07-26 13:50:06 -07:00
Tj Holowaychuk d691ecbea3 Updated docs 2010-07-26 13:49:37 -07:00
Tj Holowaychuk f60bcca893 Updated examples 2010-07-26 13:36:21 -07:00
Tj Holowaychuk 75661a2266 Route callback signature changed
it is now like Express used to be: (req, res, next)
instead of: (req, res, params, next)

access via req.params
2010-07-26 13:29:16 -07:00
Tj Holowaychuk 1026f361ef req.params.get is now req.query 2010-07-26 13:27:12 -07:00
Tj Holowaychuk 69fe203006 Fixed param tests 2010-07-26 13:25:04 -07:00
Tj Holowaychuk f8ccaa3a81 Updated configuration docs 2010-07-26 09:57:07 -07:00
Tj Holowaychuk c10a0a0cdf Style fixes 2010-07-26 09:49:04 -07:00
ewoudj aceb6ab666 Fixed issue where options.cache was always ignored in view.js. 2010-07-26 09:48:31 -07:00
Tj Holowaychuk c3a2aff9d3 Blog example using "home" 2010-07-26 08:59:26 -07:00
Tj Holowaychuk c9e41db826 Updated express(1). Closes #365 2010-07-26 08:48:34 -07:00
Tj Holowaychuk 1e7a12fff5 New "home" docs 2010-07-26 08:42:40 -07:00
Tj Holowaychuk ba88e48f6a Rebuilt docs 2010-07-26 08:36:11 -07:00
Tj Holowaychuk 52979662c5 Added docs for Server#mounted() 2010-07-26 08:30:10 -07:00
Tj Holowaychuk 50e6d80065 Added mounted hook. Closes #369 2010-07-26 08:27:36 -07:00
Tj Holowaychuk 16a24cfeac Merge branch 'fix-home' 2010-07-26 08:12:22 -07:00
Tj Holowaychuk bab095e5b5 Fixed "home" setting
Now when you use() an app, both the mounted
route and previous home setting are respected.

For example if you have an app mounted to
/blog, and "home" for blog is /posts, home
will become "/blog/posts"
2010-07-26 08:12:18 -07:00
Tj Holowaychuk b1a3b078e9 Added failing "home" setting test 2010-07-26 08:01:26 -07:00
Tj Holowaychuk baae44610a Merge branch 'fix-config' 2010-07-26 07:49:34 -07:00
Tj Holowaychuk 8d2dffe5b4 Fixed middleware/router precedence issue. Closes #366
You can now "use" your router in configure()
blocks where ever you wish, ex:

  app.use(connect.bodyDecoder())
  app.use(app.router)
  app.use(connect.staticProvider())
2010-07-26 07:49:29 -07:00
Tj Holowaychuk 7b3eb23af8 Fixed; configure() callbacks called immediately. Closes #368 2010-07-26 07:45:26 -07:00
Tj Holowaychuk fb526846fe Added failing test for config precedence 2010-07-26 07:35:38 -07:00
Tj Holowaychuk 6bd1371283 Added app.configure() immediate call test 2010-07-26 07:32:57 -07:00
Tj Holowaychuk 3c8c7af196 Updated docs 2010-07-23 17:14:09 -07:00
Tj Holowaychuk 929b43ed48 Fixed changelog typo 2010-07-23 17:09:57 -07:00
Tj Holowaychuk a947064b7d Release 1.0.0beta2 2010-07-23 17:06:47 -07:00
Tj Holowaychuk 5bc9866f43 Added range example to resource 2010-07-23 16:57:12 -07:00
Tj Holowaychuk 61d82e210a Added / to resource example 2010-07-23 16:50:30 -07:00
Tj Holowaychuk a876ac9386 Updated submodules 2010-07-23 16:42:08 -07:00
Tj Holowaychuk da1502c463 Updated expresso submodule 2010-07-23 16:12:27 -07:00
Tj Holowaychuk 76bb782f64 Added support for absolute view paths 2010-07-23 16:12:07 -07:00
Tj Holowaychuk e6f4b043cb Added test for absolute view path 2010-07-23 16:10:15 -07:00
Tj Holowaychuk d651ffaf2e Added failing test for absolute layouts 2010-07-23 16:09:06 -07:00
Tj Holowaychuk e554378b5e s/foo/relative/ 2010-07-23 16:07:58 -07:00
Tj Holowaychuk b463bd797e Added test for layouts in a directory 2010-07-23 16:07:36 -07:00
Tj Holowaychuk 699e6e16c9 Merge branch 'render-next' 2010-07-22 14:15:05 -07:00
Tj Holowaychuk f8477c41e1 res.render() exceptions passed to next() when no callback is given 2010-07-22 14:14:59 -07:00
Tj Holowaychuk 9a63333aec Added test for async render exceptions without callback 2010-07-22 14:09:53 -07:00
Tj Holowaychuk 6e40914258 No more http git submodules 2010-07-22 14:08:24 -07:00
Tj Holowaychuk 56a1dd931e No "or similar" for curl install
Because you need curl in install.sh anyways :D silly me
2010-07-22 13:14:50 -07:00
Tj Holowaychuk 57fd2e6a52 Fixed typo in install.sh 2010-07-22 13:09:01 -07:00
Tj Holowaychuk 113db06cdd Github example now using splat and splitting on /
try:

  http://dev:3000/repos/visionmedia/creationix/isaacs
2010-07-22 12:07:54 -07:00
Tj Holowaychuk 4ee5c59cfd Misc refactoring of github example 2010-07-22 11:56:23 -07:00
Tj Holowaychuk 15812678a3 Added compare view to github example
example visit:

    /repos/visionmedia..someoneelse

This helps illustrate that a RegExp literal can be used
2010-07-22 11:53:45 -07:00
Tj Holowaychuk ee0379b321 Prepping github example for compare view 2010-07-22 11:23:44 -07:00
Tj Holowaychuk dcf279177d Fixed tests due to params.splat removal 2010-07-22 11:04:54 -07:00
Tj Holowaychuk 01115824f7 Updated docs 2010-07-22 11:02:47 -07:00
Tj Holowaychuk b68473ae11 Multi-file example from blog. Closes #364 2010-07-22 09:28:59 -07:00
Tj Holowaychuk a65c203c9b Split blog example into another file 2010-07-22 09:14:29 -07:00
Tj Holowaychuk 0a848240d4 Fixed typo in docs 2010-07-22 08:46:12 -07:00
Tj Holowaychuk d03821b88a Docs for params.captures. Closes #358 2010-07-22 08:30:15 -07:00
Tj Holowaychuk 4d32762899 Updated docs 2010-07-22 08:17:00 -07:00
Tj Holowaychuk 2cb4b6d16d Added test for "env" setting 2010-07-22 08:14:48 -07:00
Tj Holowaychuk b770e566dd "home" setting defaults to Server#route. Closes #363 2010-07-22 08:13:42 -07:00
Tj Holowaychuk 51ebc88f0c Assert blog.route 2010-07-22 08:07:05 -07:00
Tj Holowaychuk a04a75724d Added app mounting test 2010-07-22 08:06:06 -07:00
Tj Holowaychuk 6e5af3d799 Added mkdir to install.sh Closes #362 2010-07-22 06:21:30 -07:00
Tj Holowaychuk 0283a73a32 Removed instanceof Array check 2010-07-21 14:49:15 -07:00
Tj Holowaychuk 5f593031f0 Added --growl flag to make test 2010-07-21 13:05:48 -07:00
Tj Holowaychuk 0eeef2d4bd Style fixes 2010-07-21 13:04:04 -07:00
Guillermo Rauch bb6164e30b Added helper method create() to view tests to get a server with the correct views directory Make the default scope for rendering the response Added tests for default scope and custom scope 2010-07-21 13:02:11 -07:00
Tj Holowaychuk d3beae4871 Updated connect 2010-07-21 12:57:16 -07:00
Tj Holowaychuk 8df0df32f8 Blog example using the newly exposed app.route when mounted 2010-07-21 12:32:17 -07:00
Tj Holowaychuk b0228dd0fd Refactored blog example 2010-07-21 12:16:58 -07:00
Tj Holowaychuk ffca2dee1d Updated submodules 2010-07-21 12:14:00 -07:00
Tj Holowaychuk cba985bfea res.render() using res.send() 2010-07-21 09:41:51 -07:00
Tj Holowaychuk 6a10a67205 Added resource example 2010-07-21 09:33:18 -07:00
Tj Holowaychuk 880fb5bd89 Revert "Removed make install-support"
This reverts commit bdfd81322b.
2010-07-20 22:11:00 -07:00
Tj Holowaychuk 6a0ade074d Updated docs 2010-07-20 16:34:47 -07:00
Tj Holowaychuk 6cf4629d0f Added Guillermo Rauch to the contributor list 2010-07-20 15:11:05 -07:00
Tj Holowaychuk ce23e5fa9e Move menu up after scrolling. Closes #352 2010-07-20 15:04:27 -07:00
Tj Holowaychuk d16fb838ca Updated connect submodule 2010-07-20 14:40:04 -07:00
Tj Holowaychuk 6b9eb8aae3 View helpers are now app specific. Closes #351 2010-07-20 14:22:54 -07:00
Tj Holowaychuk 78008d1fea Docs for Server#{helpers,dynamicHelpers}() 2010-07-20 14:02:38 -07:00
Tj Holowaychuk 69fb9bb39b Removed old view helpers test 2010-07-20 13:58:17 -07:00
Tj Holowaychuk 92f1557235 Renamed Server#helpers() to Server#dynamicHelpers() 2010-07-20 13:55:21 -07:00
Tj Holowaychuk 8e487ba36d Added assertions for dynamic helper params and scope 2010-07-20 13:48:30 -07:00
Tj Holowaychuk 7eb088b5ed Added app.helpers() docs 2010-07-20 13:45:57 -07:00
Tj Holowaychuk 9ef8ea95b0 Added dynamic view helper support. Closes #349
via app.helpers()
2010-07-20 13:40:29 -07:00
Tj Holowaychuk eedf54b485 Added test for specific layouts with "view engine" set 2010-07-20 13:06:50 -07:00
Tj Holowaychuk a461815957 Added support for passing of layout name without extension
Utilizes the child view ext
2010-07-20 12:56:08 -07:00
Tj Holowaychuk 687c2f08f6 Fixed express(1) expansion of public dirs. Closes #348
Should fix your issue, thanks!
2010-07-20 12:50:06 -07:00
Tj Holowaychuk 2294f23e5f Fixed connect links 2010-07-20 09:29:16 -07:00
Tj Holowaychuk bdfd81322b Removed make install-support 2010-07-20 08:56:23 -07:00
Tj Holowaychuk 3ceb0de8d8 Updated curl install docs 2010-07-19 15:27:53 -07:00
Tj Holowaychuk c4b5208867 Added view helper docs. Closes #344 2010-07-19 09:37:19 -07:00
Tj Holowaychuk 9c3f6b0c10 Merge branch 'fix-middleware' 2010-07-19 09:07:40 -07:00
Tj Holowaychuk 0550755c7d Fixed middleware precedence. Closes #345
The first call to app.{get,del,put,post}() will
stack the router middleware. This means config
can flow naturally BEFORE any routes
have been created, preventing breakage of
bodyDecoder etc
2010-07-19 09:07:35 -07:00
Tj Holowaychuk 47602f267a Added failing test 2010-07-19 08:40:42 -07:00
Tj Holowaychuk 656e67ef90 Cleaning up form example 2010-07-19 08:18:44 -07:00
Tj Holowaychuk c53883b635 Docs for session example 2010-07-19 08:15:15 -07:00
Tj Holowaychuk c4278c81f1 Added req.flash() to form example. Closes #338 2010-07-16 15:59:06 -07:00
Tj Holowaychuk c94dcf5940 Merge branch 'sess' 2010-07-16 15:41:35 -07:00
Tj Holowaychuk 08ca3eff12 Added session example 2010-07-16 15:41:32 -07:00
Tj Holowaychuk b40a241b2e Better blog partials 2010-07-16 13:34:35 -07:00
Tj Holowaychuk f86f1e83ad Added partial tests for collection locals + passed locals 2010-07-16 12:55:05 -07:00
Tj Holowaychuk be85701abe Added partial magic var docs. Closes #342 2010-07-16 12:51:56 -07:00
Tj Holowaychuk 190eb474a6 Refactored res.partial() 2010-07-16 12:48:34 -07:00
Tj Holowaychuk 8db1138081 Added support for "as" for non-collection partials. Closes #341 2010-07-16 12:42:05 -07:00
Tj Holowaychuk afbfd4d3fa Merge branch 'blog' 2010-07-16 11:25:35 -07:00
Tj Holowaychuk 9b8efbfdd5 Added blog mounting example 2010-07-16 11:25:30 -07:00
Tj Holowaychuk cacada87f3 Updated docs 2010-07-16 11:04:34 -07:00
Tj Holowaychuk 8a36c54318 Removed more use("/", ...)s 2010-07-16 11:03:45 -07:00
Tj Holowaychuk 879d411669 Removed app.use("/",...) from bin/express 2010-07-16 11:01:03 -07:00
Tj Holowaychuk b38be2ce7b Updated connect submodule 2010-07-16 10:59:24 -07:00
Tj Holowaychuk 1810c9b61c Docs for "view engine" setting 2010-07-16 08:31:23 -07:00
Tj Holowaychuk 98737f14f1 Added "view engine" setting to jade example 2010-07-16 08:21:26 -07:00
Tj Holowaychuk b311118a04 Removed testing docs from readme
View contrib guide on expressjs.com
2010-07-16 08:13:43 -07:00
Tj Holowaychuk 8a337f1faf Better docs for res.sendfile() 2010-07-16 08:03:20 -07:00
Tj Holowaychuk dbc5bd4104 Added link to examples 2010-07-16 07:51:23 -07:00
Tj Holowaychuk a9c3f566da Fixed migration typo 2010-07-16 07:45:22 -07:00
Tj Holowaychuk 6d9c9cd964 Removed pomo tasks 2010-07-16 07:44:42 -07:00
Tj Holowaychuk 25c8883e49 Cleaning up view docs 2010-07-16 07:44:05 -07:00
Tj Holowaychuk 793943fc2f In depth partial docs 2010-07-16 07:43:31 -07:00
Tj Holowaychuk e98f86c540 Normalizing view context option to scope 2010-07-16 07:34:30 -07:00
Tj Holowaychuk 1c8ff48f92 More view docs 2010-07-16 07:33:33 -07:00
Tj Holowaychuk 1fb73e2211 Added test-cov docs to contrib guide 2010-07-16 07:23:56 -07:00
Tj Holowaychuk 5279ade0e7 Added more req.flash() tests 2010-07-16 07:21:10 -07:00
Tj Holowaychuk 984134fb9d Missing semicolon
OMggGG :)
2010-07-16 07:17:43 -07:00
Tj Holowaychuk eb8f1f24b7 Merge remote branch 'aheckmann/beta-cacheView' into integration 2010-07-16 07:16:41 -07:00
Tj Holowaychuk e49dc8bcfa Merge remote branch 'aheckmann/beta-exposeServer' into integration 2010-07-16 07:15:42 -07:00
Tj Holowaychuk e742da24a7 Fixed doc typo 2010-07-16 07:11:08 -07:00
Aaron Heckmann 203b65475c watcher should read files async 2010-07-15 23:45:27 -04:00
Aaron Heckmann 576c5f4c9e expose Server 2010-07-15 23:17:48 -04:00
Tj Holowaychuk d2434b5591 CNAME in wrong branch :) 2010-07-15 16:57:11 -07:00
Tj Holowaychuk 634c008fcd Added CNAME 2010-07-15 16:53:50 -07:00
144 arquivos alterados com 8413 adições e 1599 exclusões
+9 -6
Ver Arquivo
@@ -1,18 +1,21 @@
[submodule "support/expresso"]
path = support/expresso
url = git://github.com/visionmedia/expresso.git
[submodule "support/jade"]
path = support/jade
url = git://github.com/visionmedia/jade.git
[submodule "support/haml"]
path = support/haml
url = git://github.com/visionmedia/haml.js.git
[submodule "support/ejs"]
path = support/ejs
url = http://github.com/visionmedia/ejs.git
url = git://github.com/visionmedia/ejs.git
[submodule "support/connect-form"]
path = support/connect-form
url = http://github.com/visionmedia/connect-form.git
url = git://github.com/visionmedia/connect-form.git
[submodule "support/connect"]
path = support/connect
url = http://github.com/senchalabs/connect.git
url = git://github.com/senchalabs/connect.git
[submodule "support/jade"]
path = support/jade
url = git://github.com/visionmedia/jade.git
[submodule "support/qs"]
path = support/qs
url = git://github.com/visionmedia/node-querystring.git
+4
Ver Arquivo
@@ -0,0 +1,4 @@
test
support
examples
docs
-21
Ver Arquivo
@@ -1,21 +0,0 @@
---
- !ruby/object:Pomo::Task
complete: false
description:
length: 25
name: TM bundle
- !ruby/object:Pomo::Task
complete: false
description:
length: 25
name: blog
- !ruby/object:Pomo::Task
complete: false
description:
length: 25
name: release on nodejs group
- !ruby/object:Pomo::Task
complete: false
description:
length: 25
name: Beta
+153
Ver Arquivo
@@ -1,4 +1,157 @@
1.0.6 / 2011-02-07
==================
* Fixed `view engine` setting bug when period is in dirname
1.0.5 / 2011-02-05
==================
* Added secret to generated app `session()` call
1.0.4 / 2011-02-05
==================
* Added `qs` dependency to _package.json_
* Fixed namespaced `require()`s for latest connect support
1.0.3 / 2011-01-13
==================
* Remove unsafe characters from JSONP callback names [Ryan Grove]
1.0.2 / 2011-01-10
==================
* Removed nested require, using `connect.router`
1.0.1 / 2010-12-29
==================
* Fixed for middleware stacked via `createServer()`
previously the `foo` middleware passed to `createServer(foo)`
would not have access to Express methods such as `res.send()`
or props like `req.query` etc.
1.0.0 / 2010-11-16
==================
* Added; deduce partial object names from the last segment.
For example by default `partial('forum/post', postObject)` will
give you the _post_ object, providing a meaningful default.
* Added http status code string representation to `res.redirect()` body
* Added; `res.redirect()` supporting _text/plain_ and _text/html_ via __Accept__.
* Added `req.is()` to aid in content negotiation
* Added partial local inheritance [suggested by masylum]. Closes #102
providing access to parent template locals.
* Added _-s, --session[s]_ flag to express(1) to add session related middleware
* Added _--template_ flag to express(1) to specify the
template engine to use.
* Added _--css_ flag to express(1) to specify the
stylesheet engine to use (or just plain css by default).
* Added `app.all()` support [thanks aheckmann]
* Added partial direct object support.
You may now `partial('user', user)` providing the "user" local,
vs previously `partial('user', { object: user })`.
* Added _route-separation_ example since many people question ways
to do this with CommonJS modules. Also view the _blog_ example for
an alternative.
* Performance; caching view path derived partial object names
* Fixed partial local inheritance precedence. [reported by Nick Poulden] Closes #454
* Fixed jsonp support; _text/javascript_ as per mailinglist discussion
1.0.0rc4 / 2010-10-14
==================
* Added _NODE_ENV_ support, _EXPRESS_ENV_ is deprecated and will be removed in 1.0.0
* Added route-middleware support (very helpful, see the [docs](http://expressjs.com/guide.html#Route-Middleware))
* Added _jsonp callback_ setting to enable/disable jsonp autowrapping [Dav Glass]
* Added callback query check on response.send to autowrap JSON objects for simple webservice implementations [Dav Glass]
* Added `partial()` support for array-like collections. Closes #434
* Added support for swappable querystring parsers
* Added session usage docs. Closes #443
* Added dynamic helper caching. Closes #439 [suggested by maritz]
* Added authentication example
* Added basic Range support to `res.sendfile()` (and `res.download()` etc)
* Changed; `express(1)` generated app using 2 spaces instead of 4
* Default env to "development" again [aheckmann]
* Removed _context_ option is no more, use "scope"
* Fixed; exposing _./support_ libs to examples so they can run without installs
* Fixed mvc example
1.0.0rc3 / 2010-09-20
==================
* Added confirmation for `express(1)` app generation. Closes #391
* Added extending of flash formatters via `app.flashFormatters`
* Added flash formatter support. Closes #411
* Added streaming support to `res.sendfile()` using `sys.pump()` when >= "stream threshold"
* Added _stream threshold_ setting for `res.sendfile()`
* Added `res.send()` __HEAD__ support
* Added `res.clearCookie()`
* Added `res.cookie()`
* Added `res.render()` headers option
* Added `res.redirect()` response bodies
* Added `res.render()` status option support. Closes #425 [thanks aheckmann]
* Fixed `res.sendfile()` responding with 403 on malicious path
* Fixed `res.download()` bug; when an error occurs remove _Content-Disposition_
* Fixed; mounted apps settings now inherit from parent app [aheckmann]
* Fixed; stripping Content-Length / Content-Type when 204
* Fixed `res.send()` 204. Closes #419
* Fixed multiple _Set-Cookie_ headers via `res.header()`. Closes #402
* Fixed bug messing with error handlers when `listenFD()` is called instead of `listen()`. [thanks guillermo]
1.0.0rc2 / 2010-08-17
==================
* Added `app.register()` for template engine mapping. Closes #390
* Added `res.render()` callback support as second argument (no options)
* Added callback support to `res.download()`
* Added callback support for `res.sendfile()`
* Added support for middleware access via `express.middlewareName()` vs `connect.middlewareName()`
* Added "partials" setting to docs
* Added default expresso tests to `express(1)` generated app. Closes #384
* Fixed `res.sendfile()` error handling, defer via `next()`
* Fixed `res.render()` callback when a layout is used [thanks guillermo]
* Fixed; `make install` creating ~/.node_libraries when not present
* Fixed issue preventing error handlers from being defined anywhere. Closes #387
1.0.0rc / 2010-07-28
==================
* Added mounted hook. Closes #369
* Added connect dependency to _package.json_
* Removed "reload views" setting and support code
development env never caches, production always caches.
* Removed _param_ in route callbacks, signature is now
simply (req, res, next), previously (req, res, params, next).
Use _req.params_ for path captures, _req.query_ for GET params.
* Fixed "home" setting
* Fixed middleware/router precedence issue. Closes #366
* Fixed; _configure()_ callbacks called immediately. Closes #368
1.0.0beta2 / 2010-07-23
==================
* Added more examples
* Added; exporting `Server` constructor
* Added `Server#helpers()` for view locals
* Added `Server#dynamicHelpers()` for dynamic view locals. Closes #349
* Added support for absolute view paths
* Added; _home_ setting defaults to `Server#route` for mounted apps. Closes #363
* Added Guillermo Rauch to the contributor list
* Added support for "as" for non-collection partials. Closes #341
* Fixed _install.sh_, ensuring _~/.node_libraries_ exists. Closes #362 [thanks jf]
* Fixed `res.render()` exceptions, now passed to `next()` when no callback is given [thanks guillermo]
* Fixed instanceof `Array` checks, now `Array.isArray()`
* Fixed express(1) expansion of public dirs. Closes #348
* Fixed middleware precedence. Closes #345
* Fixed view watcher, now async [thanks aheckmann]
1.0.0beta / 2010-07-15
==================
+22
Ver Arquivo
@@ -0,0 +1,22 @@
(The MIT License)
Copyright (c) 2009-2010 TJ Holowaychuk <tj@vision-media.ca>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+11 -6
Ver Arquivo
@@ -1,18 +1,20 @@
PREFIX = /usr/local
PREFIX ?= /usr/local
LIB_PREFIX = ~/.node_libraries
DOCS = docs/index.md \
docs/executable.md \
docs/contrib.md \
docs/guide.md \
docs/migrate.md
docs/migrate.md \
docs/applications.md
MANPAGES =$(DOCS:.md=.1)
HTMLDOCS =$(DOCS:.md=.html)
install: install-docs
@mkdir -p $(PREFIX)/bin
@mkdir -p $(LIB_PREFIX)
cp -f bin/express $(PREFIX)/bin/express
cp -fr lib/express $(LIB_PREFIX)/express
@@ -22,27 +24,28 @@ uninstall: uninstall-docs
install-support:
cd support/connect && $(MAKE) install
cd support/jade && $(MAKE) install
uninstall-support:
cd support/connect && $(MAKE) uninstall
cd support/jade && $(MAKE) uninstall
install-docs:
@mkdir -p $(PREFIX)/share/man/man1
cp -f docs/executable.1 $(PREFIX)/share/man/man1/express.1
uninstall-docs:
rm -f $(PREFIX)/share/man/man1/express.1
test:
@CONNECT_ENV=test ./support/expresso/bin/expresso \
@NODE_ENV=test ./support/expresso/bin/expresso \
-I lib \
-I support \
-I support/connect/lib \
-I support/haml/lib \
-I support/jade/lib \
-I support/ejs/lib \
$(TESTFLAGS) \
test/*.test.js
test-cov:
@TESTFLAGS=--cov $(MAKE) test
@@ -51,7 +54,9 @@ docs: docs/api.html $(MANPAGES) $(HTMLDOCS)
@./support/toc.js docs/guide.html
docs/api.html: lib/express/*.js
dox --title Express \
dox \
--private \
--title Express \
--desc "High performance web framework for [node](http://nodejs.org)." \
$(shell find lib/express/* -type f) > $@
+20 -23
Ver Arquivo
@@ -2,7 +2,7 @@
# Express
Insanely fast (and small) server-side JavaScript web development framework
built on [node](http://nodejs.org) and [Connect](http://github.com/extjs/Connect).
built on [node](http://nodejs.org) and [Connect](http://github.com/senchalabs/connect).
var app = express.createServer();
@@ -16,29 +16,26 @@
npm:
$ npm install connect
$ npm install express
curl (or similar):
curl:
$ curl -# http://github.com/visionmedia/express/raw/master/install.sh | sh
git clone, first update the submodules:
$ git submodule update --init
$ make install
$ make install-support
$ curl -# http://expressjs.com/install.sh | sh
## Features
* Robust routing
* Redirection helpers
* Dynamic view helpers
* Content negotiation
* Focus on high performance
* View rendering and partials support
* Environment based configuration
* Session based flash notifications
* Built on [Connect](http://extjs.github.com/Connect)
* Built on [Connect](http://github.com/senchalabs/connect)
* High test coverage
* Executable for generating applications quickly
* Application level view options
Via Connect:
@@ -59,27 +56,27 @@ The following are the major contributors of Express (in no specific order).
* TJ Holowaychuk ([visionmedia](http://github.com/visionmedia))
* Ciaran Jessup ([ciaranj](http://github.com/ciaranj))
* Aaron Heckmann ([aheckmann](http://github.com/aheckmann))
* Guillermo Rauch ([guille](http://github.com/guille))
## More Information
* Express [Contrib](http://github.com/visionmedia/express-contrib) repo for additional functionality
* Follow [tjholowaychuk](http://twitter.com/tjholowaychuk) on twitter for updates
* [Google Group](http://groups.google.com/group/express-js) for discussion
* [JavaScript Extensions &amp; Utilities](http://github.com/visionmedia/ext.js)
* [JavaScript Sass](http://github.com/visionmedia/sass.js)
* [JavaScript Haml](http://github.com/visionmedia/haml.js)
* [JavaScript Jade](http://github.com/visionmedia/jade) spiritual successor of Haml
* Visit the [Wiki](http://github.com/visionmedia/express/wiki)
## Running Tests
Express uses the [Expresso](http://github.com/visionmedia/expresso) TDD
framework to write and run elegant test suites extremely fast. First `$ git submodule update --init`, then run:
$ make test
## Node Compatibility
The latest release of Express is compatible with node --version:
v0.1.100
v0.2.5
and connect --version:
0.3.0
Express 1.x is maintained in the _1.x_ branch.
## License
(The MIT License)
+349 -106
Ver Arquivo
@@ -4,48 +4,66 @@
* Module dependencies.
*/
var sys = require('sys'),
fs = require('fs'),
childProcess = require('child_process');
var fs = require('fs')
, sys = require('sys')
, exec = require('child_process').exec;
/**
* Framework version.
*/
var version = '1.0.0beta';
var version = '1.0.6';
/**
* stdin stream.
*/
var stdin;
/**
* Add session support.
*/
var sessions = false;
/**
* CSS engine to utilize.
*/
var cssEngine;
/**
* Template engine to utilize.
*/
var templateEngine = 'jade';
/**
* Usage documentation.
*/
var usage = ''
+ '\x1b[1mUsage\x1b[0m: express [options] [PATH]\n'
+ '\n'
+ '\x1b[1mOptions\x1b[0m:\n'
+ ' -v, --version Output framework version\n'
+ ' -h, --help Output help information\n';
+ '\x1b[1mUsage\x1b[0m: express [options] [PATH]\n'
+ '\n'
+ '\x1b[1mOptions\x1b[0m:\n'
+ ' -s, --sessions Add session support\n'
+ ' -t, --template ENGINE Add template ENGINE support (jade|ejs). Defaults to jade\n'
+ ' -c, --css ENGINE Add stylesheet ENGINE support (less|sass). Defaults to plain css\n'
+ ' -v, --version Output framework version\n'
+ ' -h, --help Output help information\n'
;
/**
* Jade layout template.
*/
var jadeLayout = [
'!!!',
'html',
' head',
' title= title',
' link(rel=\'stylesheet\', href=\'/stylesheets/style.css\')',
' body!= body'
].join('\n');
/**
* Default sass template.
*/
var sass = [
'body',
' :padding 50px',
' :font 14px "Lucida Grande", "Helvetica Nueue", Arial, sans-serif'
'!!!'
, 'html'
, ' head'
, ' title= title'
, ' link(rel=\'stylesheet\', href=\'/stylesheets/style.css\')'
, ' body!= body'
].join('\n');
/**
@@ -53,8 +71,93 @@ var sass = [
*/
var jadeIndex = [
'h1= title',
'p Welcome to #{title}'
'h1= title'
, 'p Welcome to #{title}'
].join('\n');
/**
* EJS layout template.
*/
var ejsLayout = [
'<!DOCTYPE html>'
, '<html>'
, ' <head>'
, ' <title><%= title %></title>'
, ' <link rel=\'stylesheet\' href=\'/stylesheets/style.css\' />'
, ' </head>'
, ' <body>'
, ' <%- body %>'
, ' </body>'
, '</html>'
].join('\n');
/**
* EJS index template.
*/
var ejsIndex = [
'<h1><%= title %></h1>'
, '<p>Welcome to <%= title %></p>'
].join('\n');
/**
* Default css template.
*/
var css = [
'body {'
, ' padding: 50px;'
, ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;'
, '}'
].join('\n');
/**
* Default less template.
*/
var less = [
'body {'
, ' padding: 50px;'
, ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;'
, '}'
].join('\n');
/**
* Default sass template.
*/
var sass = [
'body'
, ' :padding 50px'
, ' :font 14px "Lucida Grande", Helvetica, Arial, sans-serif'
].join('\n');
/**
* App test template.
*/
var appTest = [
""
, "// Run $ expresso"
, ""
, "/**"
, " * Module dependencies."
, " */"
, ""
, "var app = require('../app')"
, " , assert = require('assert');"
, "",
, "module.exports = {"
, " 'GET /': function(){"
, " assert.response(app,"
, " { url: '/' },"
, " { status: 200, headers: { 'Content-Type': 'text/html; charset=utf-8' }},"
, " function(res){"
, " assert.includes(res.body, '<title>Express</title>');"
, " });"
, " }"
, "};"
].join('\n');
/**
@@ -62,88 +165,198 @@ var jadeIndex = [
*/
var app = [
'',
'/**',
' * Module dependencies.',
' */',
'',
'var express = require(\'express\'),',
' connect = require(\'connect\');',
'',
'// Create and export Express app',
'',
'var app = express.createServer();',
'',
'// Configuration',
'',
'app.configure(function(){',
' app.set(\'views\', __dirname + \'/views\');',
' app.use(\'/\', connect.bodyDecoder());',
' app.use(\'/\', connect.methodOverride());',
' app.use(\'/\', connect.compiler({ src: __dirname + \'/public\', enable: [\'sass\'] }));',
' app.use(\'/\', connect.staticProvider(__dirname + \'/public\'));',
'});',
'',
'app.configure(\'development\', function(){',
' app.set(\'reload views\', 1000);',
' app.use(\'/\', connect.errorHandler({ dumpExceptions: true, showStack: true })); ',
'});',
'',
'app.configure(\'production\', function(){',
' app.use(\'/\', connect.errorHandler()); ',
'});',
'',
'// Routes',
'',
'app.get(\'/\', function(req, res){',
' res.render(\'index.jade\', {',
' locals: {',
' title: \'Express\'',
' }',
' });',
'});',
'',
'app.listen(3000);',
''
, '/**'
, ' * Module dependencies.'
, ' */'
, ''
, 'var express = require(\'express\');'
, ''
, 'var app = module.exports = express.createServer();'
, ''
, '// Configuration'
, ''
, 'app.configure(function(){'
, ' app.set(\'views\', __dirname + \'/views\');'
, ' app.set(\'view engine\', \':TEMPLATE\');'
, ' app.use(express.bodyDecoder());'
, ' app.use(express.methodOverride());:SESS:CSS'
, ' app.use(app.router);'
, ' app.use(express.staticProvider(__dirname + \'/public\'));'
, '});'
, ''
, 'app.configure(\'development\', function(){'
, ' app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); '
, '});'
, ''
, 'app.configure(\'production\', function(){'
, ' app.use(express.errorHandler()); '
, '});'
, ''
, '// Routes'
, ''
, 'app.get(\'/\', function(req, res){'
, ' res.render(\'index\', {'
, ' locals: {'
, ' title: \'Express\''
, ' }'
, ' });'
, '});'
, ''
, '// Only listen on $ node app.js'
, ''
, 'if (!module.parent) {'
, ' app.listen(3000);'
, ' console.log("Express server listening on port %d", app.address().port)'
, '}'
, ''
].join('\n');
// Parse arguments
var args = process.argv.slice(2),
path = '.';
var args = process.argv.slice(2)
, path = '.';
while (args.length) {
var arg = args.shift();
switch (arg) {
case '-h':
case '--help':
abort(usage);
break;
case '-v':
case '--version':
abort(version);
break;
default:
path = arg;
}
var arg = args.shift();
switch (arg) {
case '-h':
case '--help':
abort(usage);
break;
case '-v':
case '--version':
abort(version);
break;
case '-s':
case '--session':
case '--sessions':
sessions = true;
break;
case '-c':
case '--css':
args.length
? (cssEngine = args.shift())
: abort('--css requires an argument');
break;
case '-t':
case '--template':
args.length
? (templateEngine = args.shift())
: abort('--template requires an argument');
break;
default:
path = arg;
}
}
// Generate application
(function createApplication(path) {
mkdir(path, function(){
mkdir(path + '/pids');
mkdir(path + '/logs');
mkdir(path + '/public/{javascripts,stylesheets,images}', function(){
write(path + '/public/stylesheets/style.sass', sass);
});
mkdir(path + '/views/partials', function(){
write(path + '/views/layout.jade', jadeLayout);
write(path + '/views/index.jade', jadeIndex);
});
write(path + '/app.js', app);
});
emptyDirectory(path, function(empty){
if (empty) {
createApplicationAt(path);
} else {
confirm('destination is not empty, continue? ', function(ok){
if (ok) {
stdin.destroy();
createApplicationAt(path);
} else {
abort('aborting');
}
});
}
});
})(path);
/**
* Create application at the given directory `path`.
*
* @param {String} path
*/
function createApplicationAt(path) {
mkdir(path, function(){
mkdir(path + '/pids');
mkdir(path + '/logs');
mkdir(path + '/public/javascripts');
mkdir(path + '/public/images');
mkdir(path + '/public/stylesheets', function(){
switch (cssEngine) {
case 'less':
write(path + '/public/stylesheets/style.less', less);
break;
case 'sass':
write(path + '/public/stylesheets/style.sass', sass);
break;
default:
write(path + '/public/stylesheets/style.css', css);
}
});
mkdir(path + '/views/partials', function(){
switch (templateEngine) {
case 'ejs':
write(path + '/views/layout.ejs', ejsLayout);
write(path + '/views/index.ejs', ejsIndex);
break;
case 'jade':
write(path + '/views/layout.jade', jadeLayout);
write(path + '/views/index.jade', jadeIndex);
break;
}
});
mkdir(path + '/test', function(){
write(path + '/test/app.test.js', appTest);
});
// CSS Engine support
switch (cssEngine) {
case 'sass':
case 'less':
app = app.replace(':CSS', '\n app.use(express.compiler({ src: __dirname + \'/public\', enable: [\'' + cssEngine + '\'] }));');
break;
default:
app = app.replace(':CSS', '');
}
// Session support
app = app.replace(':SESS', sessions
? '\n app.use(express.cookieDecoder());\n app.use(express.session({ secret: \'your secret here\' }));'
: '');
// Template support
app = app.replace(':TEMPLATE', templateEngine);
write(path + '/app.js', app);
// Suggestions
process.on('exit', function(){
if (cssEngine) {
console.log(' - make sure you have installed %s: \x1b[33m$ npm install %s\x1b[0m'
, cssEngine
, cssEngine);
}
console.log(' - make sure you have installed %s: \x1b[33m$ npm install %s\x1b[0m'
, templateEngine
, templateEngine);
});
});
}
/**
* Check if the given directory `path` is empty.
*
* @param {String} path
* @param {Function} fn
*/
function emptyDirectory(path, fn) {
fs.readdir(path, function(err, files){
if (err && err.errno !== process.ENOENT) throw err;
fn(!files || !files.length);
});
}
/**
* echo str > path.
*
@@ -152,8 +365,38 @@ while (args.length) {
*/
function write(path, str) {
fs.writeFile(path, str);
sys.puts(' create : ' + path);
fs.writeFile(path, str);
console.log(' \x1b[33mcreate\x1b[0m : ' + path);
}
/**
* Prompt confirmation with the given `msg`.
*
* @param {String} msg
* @param {Function} fn
*/
function confirm(msg, fn) {
prompt(msg, function(val){
fn(/^ *y(es)?/i.test(val));
});
}
/**
* Prompt input with the given `msg` and callback `fn`.
*
* @param {String} msg
* @param {Function} fn
*/
function prompt(msg, fn) {
stdin = stdin || process.openStdin();
sys[msg[msg.length - 1] == ' ' ? 'print' : 'puts'](msg);
stdin.setEncoding('ascii');
stdin.addListener('data', function(data){
fn(data);
stdin.removeListener('data', arguments.callee);
});
}
/**
@@ -164,11 +407,11 @@ function write(path, str) {
*/
function mkdir(path, fn) {
childProcess.exec('mkdir -p ' + path, function(err){
if (err) throw err;
sys.puts(' create : ' + path);
fn && fn();
});
exec('mkdir -p ' + path, function(err){
if (err) throw err;
console.log(' \x1b[33mcreate\x1b[0m : ' + path);
fn && fn();
});
}
/**
@@ -178,6 +421,6 @@ function mkdir(path, fn) {
*/
function abort(str) {
sys.error(str);
process.exit(1);
}
console.error(str);
process.exit(1);
}
+1005 -361
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+70
Ver Arquivo
@@ -0,0 +1,70 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "APPLICATIONS" "" "October 2010" "" ""
.
.SH "NAME"
\fBapplications\fR
.
.P
Learnboost \fIhttp://learnboost\.com\fR is a free online gradebook application, aimed to crush the competition with innovative, realtime, enjoyable features\.
.
.P
\fIhttp://learnboost\.com\fR
.
.P
Storify \fIhttp://storify\.com\fR lets you turn what people post on social media websites into compelling stories\.
.
.P
\fIhttp://storify\.com\fR
.
.P
Pakistan Survey \fIhttp://pakistansurvey\.org/\fR by Development Seed \fIhttp://developmentseed\.org\fR, provides in\-depth agency\-specific analysis from regional experts with data from 1,000 interviews across 120 villages in all seven tribal agencies and mapping of 142 reported drone strikes in FATA through July 2010\.
.
.P
\fIhttp://pakistansurvey\.org\fR
.
.P
Markup\.IO \fIhttp://markup\.io\fR allows you to draw directly on \fIany\fR website, then share with others to share your thoughts\.
.
.P
\fIhttp://markup\.io\fR
.
.P
Scrabb\.ly \fIhttp://scrabb\.ly\fR is a massively multiplayer scrabble game initially created for the Node Knockout \fIhttp://nodeknockout\.com/\fR competition\.
.
.P
\fIhttp://scrabb\.ly\fR
.
.P
ClickDummy \fIhttp://clickdummy\.net/\fR is a rapid mockup prototyping application for designers and dummies\.
.
.P
\fIhttp://clickdummy\.net\fR
.
.P
Node Knockout \fIhttp://nodeknockout\.com\fR organized the first ever node\-specific competition with hundreds of contestants\.
.
.P
\fIhttp://nodeknockout\.com\fR
.
.P
Widescript \fIhttp://widescript\.com\fR is an innovative app that helps you focus and interact with your texts \- on your desktop, your couch or on the go\.
.
.P
\fIhttp://widescript\.com\fR
.
.P
e\-resistable \fIhttp://www\.e\-resistible\.co\.uk/\fR is an online order takeaway system providing an intuitive way to fill your belly from your computer!
.
.P
\fIhttp://www\.e\-resistible\.co\.uk\fR
.
.P
Top Twitter Trends \fIhttp://toptwittertrends\.com\fR utilizes MongoDB, Socket\.IO, jQuery and many other exciting libraries to bring you trending tweets in realtime\.
.
.P
\fIhttp://toptwittertrends\.com\fR
.
.P
The applications shown above are not listed in any specific order\. To have an application added or removed please contact TJ Holowaychuk \fIhttp://github\.com/visionmedia\fR\.
+252
Ver Arquivo
@@ -0,0 +1,252 @@
<html>
<head>
<title>Express - node web framework</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<style>
#tagline {
margin-left: 75px;
margin-bottom: 30px;
color: rgba(255,255,255,0.7); }
html {
background: #1c1c1c url(images/bg.tile.jpg); }
body {
margin: 0;
padding-bottom: 30px;
font: 14px/1.4 "Helvetica Neue", "Lucida Grande", "Arial";
font-size: 14px;
line-height: 1.5;
-webkit-font-smoothing: antialiased;
background: url(images/bg.jpg) 50% 0 no-repeat;
color: #8b8b8b; }
* {
outline: none; }
em {
color: white; }
a img {
border: none !important; }
a {
font-weight: bold;
text-decoration: none;
color: white;
-webkit-transition-property: opacity, -webkit-transform, color, background-color, padding, -webkit-box-shadow;
-webkit-transition-duration: 0.15s;
-webkit-transition-timing-function: ease-out; }
a:hover {
opacity: 0.8; }
h1, h2, h3, h4 {
margin: 45px 0 0 0;
color: white;
text-shadow: 1px 2px 2px rgba(0,0,0,0.6); }
h3 {
font-size: 18px; }
h4 {
margin-left: 10px;
font-size: 14px;
}
pre {
margin: 20px 10px;
padding: 25px 20px;
background: rgba(0,0,0,0.5);
border: 1px solid #323232;
-webkit-box-shadow: 1px 2px 2px rgba(0,0,0,0.6);
-moz-box-shadow: 1px 2px 2px rgba(0,0,0,0.6);
-webkit-border-radius: 5px;
-moz-border-radius: 5px; }
code {
font-family: "Helvetica Neue", "Lucida Grande", "Arial"; }
ul {
margin: 15px 0;
padding: 0 0 0 35px; }
ul li {
margin: 0;
padding: 2px 0;
list-style: square; }
ul li ul {
margin: 0;
padding-left: 12px;
}
.man-name, #Express { display:none; }
.sect {
margin-left: 40px; }
img {
margin-left: 20px;
margin-bottom: 15px;
}
#logo {
display: block;
margin-left: 30%;
margin-bottom: 30px;
width: 194px;
height: 51px;
background: url(images/logo.png) 0 0 no-repeat;
text-indent: -99999px; }
#logo:hover {
opacity: 0.7; }
#logo:active {
opacity: 0.3; }
#ribbon {
position: fixed;
top: 0;
right: 0;
z-index: 2; }
#wrapper {
width: 100%;
min-height: 800px;
background: url(images/top.png) 0 0 repeat-x; }
#container {
margin: 0 auto;
padding-top: 80px;
width: 550px; }
#toc {
position: fixed;
top: 0;
left: 0;
margin: 0 0 0 15px;
padding: 15px;
height: 100%;
background: rgba(0,0,0,0.2);
overflow: auto;
border-right: 1px solid rgba(255,255,255,0.05);
}
#toc li {
padding: 0;
list-style: none;
}
#toc li a {
font-size: 11px;
}
#menu {
margin-left: 65px;
padding: 0;
padding-bottom: 30px; }
#menu li {
display: inline;
list-style: none; }
#menu li a {
display: block;
float: left;
margin: 0 2px;
padding: 3px 15px;
background: rgba(0,0,0,0.2);
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
-webkit-box-shadow: 1px 2px 2px rgba(0,0,0,0.6);
-moz-box-shadow: 1px 2px 2px rgba(0,0,0,0.6);
-webkit-transition-property: opacity, -webkit-transform, color, background-color, -webkit-box-shadow;
-webkit-transition-duration: 0.15s;
-webkit-transition-timing-function: ease-out; }
#menu li a:hover,
#menu li a.active {
background: rgba(0,0,0,0.5); }
#menu li a:active {
background: rgba(0,0,0,0.1);
-webkit-box-shadow: 1px 1px 1px rgba(0,0,0,0.4);
-moz-box-shadow: 1px 1px 1px rgba(0,0,0,0.4); }
</style>
<script>
$(function(){
$('.section').hide();
$('.toggle, a.section-title').toggle(function(){
$(this).siblings('ul').fadeIn(300);
return false;
}, function(){
$(this).siblings('ul').fadeOut(300);
return false;
});
});
</script>
</head>
<body>
<a href='http://github.com/visionmedia/express'>
<img alt='Fork me on GitHub' id='ribbon' src='http://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png' />
</a>
<div id="wrapper">
<div id="container">
<a href='http://github.com/visionmedia/express' id='logo'>Express</a>
<p id="tagline">
High performance, high class web development for
<a href="http://nodejs.org">Node.js</a>
</p>
<ul id="menu">
<li><a href="index.html">Home</a></li>
<li><a href="guide.html">Guide</a></li>
<li><a href="contrib.html">Contributing</a></li>
<li><a href="applications.html">Applications</a></li>
</ul>
<div class='mp'>
<h2 id="Express">Express</h2>
<p class="man-name">
<code>applications</code>
</p>
<br />
<p><a href="http://learnboost.com">Learnboost</a> is a free online gradebook application, aimed to crush the competition with innovative, realtime, enjoyable features.</p>
<p><a href="http://learnboost.com"><img src="images/apps/learnboost.png" alt="LearnBoost" /></a></p>
<p><a href="http://storify.com">Storify</a> lets you turn what people post on social media websites into compelling stories.</p>
<p><a href="http://storify.com"><img src="images/apps/storify.png" alt="Storify" /></a></p>
<p><a href="http://pakistansurvey.org/">Pakistan Survey</a> by <a href="http://developmentseed.org">Development Seed</a>, provides in-depth agency-specific analysis from regional experts with data from 1,000 interviews across 120 villages in all seven tribal agencies and mapping of 142 reported drone strikes in FATA through July 2010.</p>
<p><a href="http://pakistansurvey.org"><img src="images/apps/developmentseed.png" alt="Pakistan Survey" /></a></p>
<p><a href="http://markup.io">Markup.IO</a> allows you to draw directly on <em>any</em> website, then share with others to share your thoughts.</p>
<p><a href="http://markup.io"><img src="images/apps/markupio.png" alt="Markup.IO" /></a></p>
<p><a href="http://scrabb.ly">Scrabb.ly</a> is a massively multiplayer scrabble game initially created for the <a href="http://nodeknockout.com/">Node Knockout</a> competition.</p>
<p><a href="http://scrabb.ly"><img src="images/apps/scrabbly.png" alt="Online Realtime Scrabble" /></a></p>
<p><a href="http://clickdummy.net/">ClickDummy</a> is a rapid mockup prototyping application for designers and dummies.</p>
<p><a href="http://clickdummy.net"><img src="images/apps/clickdummy.png" alt="Mockup Prototying" /></a></p>
<p><a href="http://nodeknockout.com">Node Knockout</a> organized the first ever node-specific competition with hundreds of contestants.</p>
<p><a href="http://nodeknockout.com"><img src="images/apps/nodeko.png" alt="Node Knockout Competition Express" /></a></p>
<p><a href="http://widescript.com">Widescript</a> is an innovative app that helps you focus and interact with your texts - on your desktop, your couch or on the go.</p>
<p><a href="http://widescript.com"><img src="images/apps/widescript.png" alt="Widescript" /></a></p>
<p><a href="http://www.e-resistible.co.uk/">e-resistable</a> is an online order takeaway system providing an intuitive way to fill your belly from your computer!</p>
<p><a href="http://www.e-resistible.co.uk"><img src="images/apps/e-resistable.png" alt="Online Takeaway" /></a></p>
<p><a href="http://toptwittertrends.com">Top Twitter Trends</a> utilizes MongoDB, Socket.IO, jQuery and many other exciting libraries to bring you trending tweets in realtime.</p>
<p><a href="http://toptwittertrends.com"><img src="images/apps/toptwittertrends.png" alt="Twitter Trends" /></a></p>
<br />
<p>The applications shown above are not listed in any specific order. To have an application added or removed please contact <a href="http://github.com/visionmedia">TJ Holowaychuk</a>.</p>
</div>
</div>
</div>
</body>
</html>
+47
Ver Arquivo
@@ -0,0 +1,47 @@
<br />
[Learnboost](http://learnboost.com) is a free online gradebook application, aimed to crush the competition with innovative, realtime, enjoyable features.
[![LearnBoost](images/apps/learnboost.png)](http://learnboost.com)
[Storify](http://storify.com) lets you turn what people post on social media websites into compelling stories.
[![Storify](images/apps/storify.png)](http://storify.com)
[Pakistan Survey](http://pakistansurvey.org/) by [Development Seed](http://developmentseed.org), provides in-depth agency-specific analysis from regional experts with data from 1,000 interviews across 120 villages in all seven tribal agencies and mapping of 142 reported drone strikes in FATA through July 2010.
[![Pakistan Survey](images/apps/developmentseed.png)](http://pakistansurvey.org)
[Markup.IO](http://markup.io) allows you to draw directly on _any_ website, then share with others to share your thoughts.
[![Markup.IO](images/apps/markupio.png)](http://markup.io)
[Scrabb.ly](http://scrabb.ly) is a massively multiplayer scrabble game initially created for the [Node Knockout](http://nodeknockout.com/) competition.
[![Online Realtime Scrabble](images/apps/scrabbly.png)](http://scrabb.ly)
[ClickDummy](http://clickdummy.net/) is a rapid mockup prototyping application for designers and dummies.
[![Mockup Prototying](images/apps/clickdummy.png)](http://clickdummy.net)
[Node Knockout](http://nodeknockout.com) organized the first ever node-specific competition with hundreds of contestants.
[![Node Knockout Competition Express](images/apps/nodeko.png)](http://nodeknockout.com)
[Widescript](http://widescript.com) is an innovative app that helps you focus and interact with your texts - on your desktop, your couch or on the go.
[![Widescript](images/apps/widescript.png)](http://widescript.com)
[e-resistable](http://www.e-resistible.co.uk/) is an online order takeaway system providing an intuitive way to fill your belly from your computer!
[![Online Takeaway](images/apps/e-resistable.png)](http://www.e-resistible.co.uk)
[Top Twitter Trends](http://toptwittertrends.com) utilizes MongoDB, Socket.IO, jQuery and many other exciting libraries to bring you trending tweets in realtime.
[![Twitter Trends](images/apps/toptwittertrends.png)](http://toptwittertrends.com)
<br />
The applications shown above are not listed in any specific order. To have an application added or removed please contact [TJ Holowaychuk](http://github.com/visionmedia).
+23 -5
Ver Arquivo
@@ -1,7 +1,10 @@
.\" generated with Ronn/v0.6.6
.\" http://github.com/rtomayko/ronn/
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "CONTRIB" "" "July 2010" "" ""
.TH "CONTRIB" "" "October 2010" "" ""
.
.SH "NAME"
\fBcontrib\fR
.
.SS "Development Dependencies"
Express development dependencies are stored within the \fI\./support\fR directory\. To update them execute:
@@ -42,6 +45,19 @@ $ make test TESTS=test/view\.test\.js
.
.IP "" 0
.
.P
To check test coverage run:
.
.IP "" 4
.
.nf
$ make test\-cov
.
.fi
.
.IP "" 0
.
.SS "Contributions"
To accept a contribution, you should follow these guidelines:
.
@@ -58,7 +74,9 @@ Your commit(s) should be \fIfocused\fR, do not commit once for several changes
Do \fInot\fR alter release information such as the \fIversion\fR, or \fIHistory\.md\fR
.
.IP "\(bu" 4
Indents are \fI4\fR spaces\.
Indents are \fI2\fR spaces\.
.
.IP "" 0
.
.SS "Documentation"
To contribute documentation edit the markdown files in \fI\./docs\fR, however do \fInot\fR run \fImake docs\fR, as they will be re\-built and published with each release\.
+49 -22
Ver Arquivo
@@ -1,20 +1,8 @@
<html>
<head>
<title>Express - node web framework</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<style>
#header {
position: absolute;
top: 10px;
left: 0;
padding: 12px 0;
text-indent: 40px;
width: 100%;
border-top: 1px solid rgba(0,0,0,0.7);
border-bottom: 1px solid rgba(0,0,0,0.7);
background: rgba(255,255,255,0.1) url(http://www.sencha.com/favicon.ico) no-repeat 15px 50%;
text-align: left;
color: #fff;
}
#tagline {
margin-left: 75px;
margin-bottom: 30px;
@@ -28,8 +16,7 @@
font: 14px/1.4 "Helvetica Neue", "Lucida Grande", "Arial";
font-size: 14px;
line-height: 1.5;
-webkit-text-stroke: 1px rgba(0, 0, 0, 0.1);
-moz-text-stroke: 1px rgba(0, 0, 0, 0.1);
-webkit-font-smoothing: antialiased;
background: url(images/bg.jpg) 50% 0 no-repeat;
color: #8b8b8b; }
@@ -52,13 +39,17 @@
a:hover {
opacity: 0.8; }
h1, h2, h3 {
h1, h2, h3, h4 {
margin: 45px 0 0 0;
color: white;
text-shadow: 1px 2px 2px rgba(0,0,0,0.6); }
h3 {
font-size: 18px; }
h4 {
margin-left: 10px;
font-size: 14px;
}
pre {
margin: 20px 10px;
@@ -80,9 +71,19 @@
margin: 0;
padding: 2px 0;
list-style: square; }
ul li ul {
margin: 0;
padding-left: 12px;
}
.man-name, #Express { display:none; }
.sect {
margin-left: 40px; }
img {
margin-left: 20px;
margin-bottom: 15px;
}
#logo {
display: block;
@@ -110,21 +111,22 @@
#container {
margin: 0 auto;
padding-top: 110px;
padding-top: 80px;
width: 550px; }
#toc {
position: fixed;
top: 60px;
top: 0;
left: 0;
margin: 0 0 0 15px;
padding: 15px;
height: 100%;
background: rgba(0,0,0,0.2);
overflow: auto;
border-right: 1px solid rgba(255,255,255,0.05);
}
#toc li {
padding: 1px 0;
padding: 0;
list-style: none;
}
#toc li a {
@@ -158,12 +160,23 @@
-webkit-box-shadow: 1px 1px 1px rgba(0,0,0,0.4);
-moz-box-shadow: 1px 1px 1px rgba(0,0,0,0.4); }
</style>
<script>
$(function(){
$('.section').hide();
$('.toggle, a.section-title').toggle(function(){
$(this).siblings('ul').fadeIn(300);
return false;
}, function(){
$(this).siblings('ul').fadeOut(300);
return false;
});
});
</script>
</head>
<body>
<a href='http://github.com/visionmedia/express'>
<img alt='Fork me on GitHub' id='ribbon' src='http://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png' />
</a>
<div id="header"><strong>Sencha</strong> labs</div>
<div id="wrapper">
<div id="container">
<a href='http://github.com/visionmedia/express' id='logo'>Express</a>
@@ -175,9 +188,13 @@
<li><a href="index.html">Home</a></li>
<li><a href="guide.html">Guide</a></li>
<li><a href="contrib.html">Contributing</a></li>
<li><a href="migrate.html">1.x Migration</a></li>
<li><a href="applications.html">Applications</a></li>
</ul>
<div class='mp'>
<h2 id="Express">Express</h2>
<p class="man-name">
<code>contrib</code>
</p>
<h3 id="Development-Dependencies">Development Dependencies</h3>
<p>Express development dependencies are stored within the <em>./support</em> directory. To
@@ -200,6 +217,11 @@ simply execute:</p>
<pre><code>$ make test TESTS=test/view.test.js
</code></pre>
<p>To check test coverage run:</p>
<pre><code>$ make test-cov
</code></pre>
<h3 id="Contributions">Contributions</h3>
<p>To accept a contribution, you should follow these guidelines:</p>
@@ -209,10 +231,15 @@ simply execute:</p>
<li>Your alterations or additions <em>must</em> include tests</li>
<li>Your commit(s) should be <em>focused</em>, do not commit once for several changes</li>
<li>Do <em>not</em> alter release information such as the <em>version</em>, or <em>History.md</em></li>
<li>Indents are <em>4</em> spaces.</li>
<li>Indents are <em>2</em> spaces.</li>
</ul>
<h3 id="Documentation">Documentation</h3>
<p>To contribute documentation edit the markdown files in <em>./docs</em>, however
do <em>not</em> run <em>make docs</em>, as they will be re-built and published with each release.</p>
</div>
</div>
</div>
+10 -1
Ver Arquivo
@@ -18,6 +18,10 @@ To target specific suites we may specify the files via:
$ make test TESTS=test/view.test.js
To check test coverage run:
$ make test-cov
### Contributions
To accept a contribution, you should follow these guidelines:
@@ -26,4 +30,9 @@ To accept a contribution, you should follow these guidelines:
* Your alterations or additions _must_ include tests
* Your commit(s) should be _focused_, do not commit once for several changes
* Do _not_ alter release information such as the _version_, or _History.md_
* Indents are _4_ spaces.
* Indents are _2_ spaces.
### Documentation
To contribute documentation edit the markdown files in _./docs_, however
do _not_ run _make docs_, as they will be re-built and published with each release.
+9 -4
Ver Arquivo
@@ -1,13 +1,16 @@
.\" generated with Ronn/v0.6.6
.\" http://github.com/rtomayko/ronn/
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "EXECUTABLE" "" "July 2010" "" ""
.TH "EXECUTABLE" "" "October 2010" "" ""
.
.SH "NAME"
\fBexecutable\fR
.
.SH "Synopsis"
.
.nf
express [\-h|\-\-help] [\-v|\-\-version] [PATH]
express [\-h|\-\-help] [\-v|\-\-version] [\-c|\-css ENGINE] [PATH]
.
.fi
.
@@ -18,6 +21,8 @@ The \fBexpress\fR executable generates apps at the given \fBPATH\fR or the curre
.
.nf
\-s, \-\-sessions Add session support
\-c, \-\-css ENGINE Add css ENGINE support (less|sass)\. Defaults to plain css
\-v, \-\-version Output framework version
\-h, \-\-help Display help information
.
+42 -23
Ver Arquivo
@@ -1,20 +1,8 @@
<html>
<head>
<title>Express - node web framework</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<style>
#header {
position: absolute;
top: 10px;
left: 0;
padding: 12px 0;
text-indent: 40px;
width: 100%;
border-top: 1px solid rgba(0,0,0,0.7);
border-bottom: 1px solid rgba(0,0,0,0.7);
background: rgba(255,255,255,0.1) url(http://www.sencha.com/favicon.ico) no-repeat 15px 50%;
text-align: left;
color: #fff;
}
#tagline {
margin-left: 75px;
margin-bottom: 30px;
@@ -28,8 +16,7 @@
font: 14px/1.4 "Helvetica Neue", "Lucida Grande", "Arial";
font-size: 14px;
line-height: 1.5;
-webkit-text-stroke: 1px rgba(0, 0, 0, 0.1);
-moz-text-stroke: 1px rgba(0, 0, 0, 0.1);
-webkit-font-smoothing: antialiased;
background: url(images/bg.jpg) 50% 0 no-repeat;
color: #8b8b8b; }
@@ -52,13 +39,17 @@
a:hover {
opacity: 0.8; }
h1, h2, h3 {
h1, h2, h3, h4 {
margin: 45px 0 0 0;
color: white;
text-shadow: 1px 2px 2px rgba(0,0,0,0.6); }
h3 {
font-size: 18px; }
h4 {
margin-left: 10px;
font-size: 14px;
}
pre {
margin: 20px 10px;
@@ -80,9 +71,19 @@
margin: 0;
padding: 2px 0;
list-style: square; }
ul li ul {
margin: 0;
padding-left: 12px;
}
.man-name, #Express { display:none; }
.sect {
margin-left: 40px; }
img {
margin-left: 20px;
margin-bottom: 15px;
}
#logo {
display: block;
@@ -110,21 +111,22 @@
#container {
margin: 0 auto;
padding-top: 110px;
padding-top: 80px;
width: 550px; }
#toc {
position: fixed;
top: 60px;
top: 0;
left: 0;
margin: 0 0 0 15px;
padding: 15px;
height: 100%;
background: rgba(0,0,0,0.2);
overflow: auto;
border-right: 1px solid rgba(255,255,255,0.05);
}
#toc li {
padding: 1px 0;
padding: 0;
list-style: none;
}
#toc li a {
@@ -158,12 +160,23 @@
-webkit-box-shadow: 1px 1px 1px rgba(0,0,0,0.4);
-moz-box-shadow: 1px 1px 1px rgba(0,0,0,0.4); }
</style>
<script>
$(function(){
$('.section').hide();
$('.toggle, a.section-title').toggle(function(){
$(this).siblings('ul').fadeIn(300);
return false;
}, function(){
$(this).siblings('ul').fadeOut(300);
return false;
});
});
</script>
</head>
<body>
<a href='http://github.com/visionmedia/express'>
<img alt='Fork me on GitHub' id='ribbon' src='http://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png' />
</a>
<div id="header"><strong>Sencha</strong> labs</div>
<div id="wrapper">
<div id="container">
<a href='http://github.com/visionmedia/express' id='logo'>Express</a>
@@ -175,12 +188,16 @@
<li><a href="index.html">Home</a></li>
<li><a href="guide.html">Guide</a></li>
<li><a href="contrib.html">Contributing</a></li>
<li><a href="migrate.html">1.x Migration</a></li>
<li><a href="applications.html">Applications</a></li>
</ul>
<div class='mp'>
<h2 id="Express">Express</h2>
<p class="man-name">
<code>executable</code>
</p>
<h2 id="Synopsis">Synopsis</h2>
<pre><code>express [-h|--help] [-v|--version] [PATH]
<pre><code>express [-h|--help] [-v|--version] [-c|-css ENGINE] [PATH]
</code></pre>
<h2 id="Description">Description</h2>
@@ -191,7 +208,9 @@ application structure, this executable creates a maintainable base app.</p>
<h2 id="Options">Options</h2>
<pre><code>-v, --version Output framework version
<pre><code>-s, --sessions Add session support
-c, --css ENGINE Add css ENGINE support (less|sass). Defaults to plain css
-v, --version Output framework version
-h, --help Display help information
</code></pre>
+3 -1
Ver Arquivo
@@ -1,7 +1,7 @@
## Synopsis
express [-h|--help] [-v|--version] [PATH]
express [-h|--help] [-v|--version] [-c|-css ENGINE] [PATH]
## Description
@@ -11,6 +11,8 @@ application structure, this executable creates a maintainable base app.
## Options
-s, --sessions Add session support
-c, --css ENGINE Add css ENGINE support (less|sass). Defaults to plain css
-v, --version Output framework version
-h, --help Display help information
+1101 -97
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+735 -105
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+598 -68
Ver Arquivo
@@ -1,21 +1,14 @@
### Installation
curl:
$ curl -# http://expressjs.com/install.sh | sh
npm:
$ npm install connect
$ npm install express
curl (or similar):
$ curl -# http://github.com/visionmedia/express/raw/master/install.sh | sh
git clone, first update the submodules:
$ git submodule update --init
$ make install
$ make install-support
### Creating An Application
The _express.Server_ now inherits from _http.Server_, however
@@ -39,19 +32,25 @@ prior to the environment specific callback.
In the example below we only _dumpExceptions_, and respond with exception stack traces
in _development_ mode, however for both environments we utilize _methodOverride_ and _bodyDecoder_.
Note the use of _app.router_, which can (optionally) be used to mount the application routes,
otherwise the first call to _app.{get,put,del,post}()_ will mount the routes.
app.configure(function(){
app.use('/', connect.methodOverride());
app.use('/', connect.bodyDecoder());
});
app.configure('development', function(){
app.use('/', connect.errorHandler({ dumpExceptions: true, showStack: true }));
});
app.configure('production', function(){
app.use('/', connect.errorHandler());
});
app.use(express.methodOverride());
app.use(express.bodyDecoder());
app.use(app.router);
});
app.configure('development', function(){
app.use(express.staticProvider(__dirname + '/public'));
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
app.configure('production', function(){
var oneYear = 31557600000;
app.use(express.staticProvider({ root: __dirname + '/public', maxAge: oneYear }));
app.use(express.errorHandler());
});
For internal and arbitrary settings Express provides the _set(key[, val])_, _enable(key)_, _disable(key)_ methods:
@@ -67,41 +66,57 @@ For internal and arbitrary settings Express provides the _set(key[, val])_, _ena
// same as app.set('some feature', false);
});
To alter the environment we can set the _CONNECT_ENV_ environment variable,
or more specifically _EXPRESS_ENV_, for example:
To alter the environment we can set the _NODE_ENV_ environment variable, for example:
$ EXPRESS_ENV=production node app.js
$ NODE_ENV=production node app.js
This is _very_ important, as many caching mechanisms are _only enabled_ when in production.
### Settings
Express supports the following settings out of the box:
* _env_ Application environment set internally, use _app.set('env')_ to utilize
* _home_ Application base path used with _res.redirect()_
* _env_ Application environment set internally, use _app.set('env')_ on _Server#listen()_
* _home_ Application base path used for _res.redirect()_ and transparently handling mounted apps.
* _views_ Root views directory defaulting to **CWD/views**
* _view engine_ Default view engine name for views rendered without extensions
* _reload views_ Reloads altered views, by default watches for _mtime_ changes with
with a 5 minute interval. Example: _app.set('reload views', 60000);_
* _view options_ An object specifying global view options
* _partials_ Root view partials directory defaulting to _views_/partials.
* _stream threshold_ Bytesize indicating when a file should be streamed for _res.sendfile()_ using _fs.ReadStream()_ and _sys.pump()_.
### Routing
Express utilizes the HTTP verbs to provide a meaningful, expressive routing API.
For example we may want to render a user's account for the path _/user/12_, this
can be done by defining the route below. The values associated to the named placeholders,
are passed as the _third_ argument, which here we name _params_.
can be done by defining the route below. The values associated to the named placeholders
are available as `req.params`.
app.get('/user/:id', function(req, res, params){
res.send('user ' + params.id);
});
app.get('/user/:id', function(req, res){
res.send('user ' + req.params.id);
});
A route is simple a string which is compiled to a _RegExp_ internally. For example
when _/user/:id_ is compiled, a simplified version of the regexp may look similar to:
\/user\/([^\/]+)\/?
Literal regular expressions may also be passed for complex uses:
Regular expression literals may also be passed for complex uses. Since capture
groups with literal _RegExp_'s are anonymous we can access them directly `req.params`.
app.get(/^\/foo(bar)?$/, function(){});
app.get(/^\/users?(?:\/(\d+)(?:\.\.(\d+))?)?/, function(req, res){
res.send(req.params);
});
Curl requests against the previously defined route:
$ curl http://dev:3000/user
[null,null]
$ curl http://dev:3000/users
[null,null]
$ curl http://dev:3000/users/1
["1",null]
$ curl http://dev:3000/users/1..15
["1","15"]
Below are some route examples, and the associated paths that they
may consume:
@@ -134,39 +149,209 @@ may consume:
/products.xml
/products
For example we can __POST__ some json, and echo the json back using the _bodyDecoder_ middleware which will parse json request bodies (as well as others), and place the result in _req.body_:
var express = require('express')
, app = express.createServer();
app.use(express.bodyDecoder());
app.post('/', function(req, res){
res.send(req.body);
});
app.listen(3000);
### Passing Route Control
We may pass control to the next _matching_ route, by calling the _fourth_ parameter,
the _next()_ function. When a match cannot be made, control is passed back to Connect.
We may pass control to the next _matching_ route, by calling the _third_ argument,
the _next()_ function. When a match cannot be made, control is passed back to Connect,
and middleware continue to be invoked. The same is true for several routes which have the same path defined, they will simply be executed in order until one does _not_ call _next()_.
app.get('/users/:id?', function(req, res, params){
if (params.id) {
app.get('/users/:id?', function(req, res, next){
var id = req.params.id;
if (id) {
// do something
} else {
next();
}
});
app.get('/users', function(req, res, params){
app.get('/users', function(req, res){
// do something else
});
Express 1.0 also introduces the _all()_ method, which provides a route callback matching any HTTP method. This is useful in many ways, one example being the loading of resources before executing subsequent routes as shown below:
var express = require('express')
, app = express.createServer();
var users = [{ name: 'tj' }];
app.all('/user/:id/:op?', function(req, res, next){
req.user = users[req.params.id];
if (req.user) {
next();
} else {
next(new Error('cannot find user ' + req.params.id));
}
});
app.get('/user/:id', function(req, res){
res.send('viewing ' + req.user.name);
});
app.get('/user/:id/edit', function(req, res){
res.send('editing ' + req.user.name);
});
app.put('/user/:id', function(req, res){
res.send('updating ' + req.user.name);
});
app.get('*', function(req, res){
res.send('what???', 404);
});
app.listen(3000);
### Middleware
The Express _Plugin_ is no more! middleware via [Connect](http://github.com/extjs/Connect) can be
Middleware via [Connect](http://github.com/senchalabs/connect) can be
passed to _express.createServer()_ as you would with a regular Connect server. For example:
var connect = require('connect'),
express = require('express');
var express = require('express');
var app = express.createServer(
connect.logger(),
connect.bodyDecoder()
);
express.logger(),
express.bodyDecoder()
);
Alternatively we can _use()_ them which is useful when adding middleware within _configure()_ blocks:
app.use('/', connect.logger({ format: ':method :uri' }));
app.use(express.logger({ format: ':method :uri' }));
Typically with connect middleware you would _require('connect')_ like so:
var connect = require('connect');
app.use(connect.logger());
This is somewhat annoying, so express re-exports these middleware properties, however they are _identical_:
app.use(express.logger());
### Route Middleware
Routes may utilize route-specific middleware by passing one or more additional callbacks (or arrays) to the method. This feature is extremely useful for restricting access, loading data used by the route etc.
Typically async data retrieval might look similar to below, where we take the _:id_ parameter, and attempt loading a user.
app.get('/user/:id', function(req, res, next){
loadUser(req.params.id, function(err, user){
if (err) return next(err);
res.send('Viewing user ' + user.name);
});
});
To keep things DRY and to increase readability we can apply this logic within a middleware. As you can see below, abstracting this logic into middleware allows us to reuse it, and clean up our route at the same time.
function loadUser(req, res, next) {
// You would fetch your user from the db
var user = users[req.params.id];
if (user) {
req.user = user;
next();
} else {
next(new Error('Failed to load user ' + req.params.id));
}
}
app.get('/user/:id', loadUser, function(req, res){
res.send('Viewing user ' + req.user.name);
});
Multiple route middleware can be applied, and will be executed sequentially to apply further logic such as restricting access to a user account. In the example below only the authenticated user may edit his/her account.
function andRestrictToSelf(req, res, next) {
req.authenticatedUser.id == req.user.id
? next()
: next(new Error('Unauthorized'));
}
app.get('/user/:id/edit', loadUser, andRestrictToSelf, function(req, res){
res.send('Editing user ' + req.user.name);
});
Keeping in mind that middleware are simply functions, we can define function that _returns_ the middleware in order to create a more expressive and flexible solution as shown below.
function andRestrictTo(role) {
return function(req, res, next) {
req.authenticatedUser.role == role
? next()
: next(new Error('Unauthorized'));
}
}
app.del('/user/:id', loadUser, andRestrictTo('admin'), function(req, res){
res.send('Deleted user ' + req.user.name);
});
Commonly used "stacks" of middleware can be passed as an array (_applied recursively_), which can be mixed and matched to any degree.
var a = [middleware1, middleware2]
, b = [middleware3, middleware4]
, all = [a, b];
app.get('/foo', a, function(){});
app.get('/bar', a, function(){});
app.get('/', a, middleware3, middleware4, function(){});
app.get('/', a, b, function(){});
app.get('/', all, function(){});
For this example in full, view the [route middleware example](http://github.com/visionmedia/express/blob/master/examples/route-middleware/app.js) in the repository.
### HTTP Methods
We have seen _app.get()_ a few times, however Express also exposes other familiar HTTP verbs in the same manor, such as _app.post()_, _app.del()_, etc.
A common example for _POST_ usage, is when "submitting" a form. Below we simply set our form method to "post" in our html, and control will be given to the route we have defined below it.
<form method="post" action="/">
<input type="text" name="user[name]" />
<input type="text" name="user[email]" />
<input type="submit" value="Submit" />
</form>
By default Express does not know what to do with this request body, so we should add the _bodyDecoder_ middleware, which will parse _application/x-www-form-urlencoded_ request bodies and place the variables in _req.body_. We can do this by "using" the middleware as shown below:
app.use(express.bodyDecoder());
Our route below will now have access to the _req.body.user_ object which will contain the _name_ and _email_ properties when defined.
app.post('/', function(req, res){
console.log(req.body.user);
res.redirect('back');
});
When using methods such as _PUT_ with a form, we can utilize a hidden input named _\_method_, which can be used to alter the HTTP method. To do so we first need the _methodOverride_ middleware, which should be placed below _bodyDecoder_ so that it can utilize it's _req.body_ containing the form values.
app.use(express.bodyDecoder());
app.use(express.methodOverride());
The reason that these are not always defaults, is simply because these are not required for Express to be fully functional. Depending on the needs of your application, you may not need these at all, your methods such as _PUT_ and _DELETE_ can still be accessed by clients which can use them directly, although _methodOverride_ provides a great solution for forms. Below shows what the usage of _PUT_ might look like:
<form method="post" action="/">
<input type="hidden" name="_method" value="put" />
<input type="text" name="user[name]" />
<input type="text" name="user[email]" />
<input type="submit" value="Submit" />
</form>
app.put('/', function(){
console.log(req.body.user);
res.redirect('back');
});
### Error Handling
@@ -194,6 +379,11 @@ We can call _app.error()_ several times as shown below.
Here we check for an instanceof _NotFound_ and show the
404 page, or we pass on to the next error handler.
Note that these handlers can be defined anywhere, as they
will be placed below the route handlers on _listen()_. This
allows for definition within _configure()_ blocks so we can
handle exceptions in different ways based on the environment.
app.error(function(err, req, res, next){
if (err instanceof NotFound) {
res.render('404.jade');
@@ -217,12 +407,12 @@ Our apps could also utilize the Connect _errorHandler_ middleware
to report on exceptions. For example if we wish to output exceptions
in "development" mode to _stderr_ we can use:
app.use('/', connect.errorHandler({ dumpExceptions: true }));
app.use(express.errorHandler({ dumpExceptions: true }));
Also during development we may want fancy html pages to show exceptions
that are passed or thrown, so we can set _showStack_ to true:
app.use('/', connect.errorHandler({ showStack: true, dumpExceptions: true }));
app.use(express.errorHandler({ showStack: true, dumpExceptions: true }));
The _errorHandler_ middleware also responds with _json_ if _Accept: application/json_
is present, which is useful for developing apps that rely heavily on client-side JavaScript.
@@ -231,9 +421,8 @@ is present, which is useful for developing apps that rely heavily on client-side
View filenames take the form _NAME_._ENGINE_, where _ENGINE_ is the name
of the module that will be required. For example the view _layout.ejs_ will
tell the view system to _require('ejs')_, the module being loaded must (currently)
export the method _exports.render(str, options)_ to comply with Express, however
with will likely be extensible in the future.
tell the view system to _require('ejs')_, the module being loaded must export the method _exports.render(str, options)_ to comply with Express, however
_app.register()_ can be used to map engines to file extensions, so that for example "foo.html" can be rendered by jade.
Below is an example using [Haml.js](http://github.com/visionmedia/haml.js) to render _index.html_,
and since we do not use _layout: false_ the rendered contents of _index.html_ will be passed as
@@ -245,6 +434,53 @@ the _body_ local variable in _layout.haml_.
});
});
The new _view engine_ setting allows us to specify our default template engine,
so for example when using [Jade](http://github.com/visionmedia/jade) we could set:
app.set('view engine', 'jade');
Allowing us to render with:
res.render('index');
vs:
res.render('index.jade');
When _view engine_ is set, extensions are entirely optional, however we can still
mix and match template engines:
res.render('another-page.ejs');
Express also provides the _view options_ setting, which is applied each time a view is rendered, so for example if you rarely use layouts you may set:
app.set('view options', {
layout: false
});
Which can then be overridden within the `res.render()` call if need be:
res.render('myview.ejs', { layout: true });
When an alternate layout is required, we may also specify a path. For example if we have _view engine_ set to _jade_ and a file named _./views/mylayout.jade_ we can simply pass:
res.render('page', { layout: 'mylayout' });
Otherwise we must specify the extension:
res.render('page', { layout: 'mylayout.jade' });
These paths may also be absolute:
res.render('page', { layout: __dirname + '/../../mylayout.jade' });
A good example of this is specifying custom _ejs_ opening and closing tags:
app.set('view options', {
open: '{{',
close: '}}'
});
### View Partials
The Express view system has built-in support for partials and collections, which are
@@ -261,15 +497,72 @@ however if we wished we could use an ejs partial, within a haml view for example
And once again even further, when rendering a collection we can simply pass
an array, if no other options are desired:
partial('comments', comments);
partial('comment', comments);
When using the partial collection support a few "magic" variables are provided
for free:
* _firstInCollection_ True if this is the first object
* _indexInCollection_ Index of the object in the collection
* _lastInCollection_ True if this is the last object
* _collectionLength_ Length of the collection
For documentation on altering the object name view [res.partial()](http://expressjs.com/guide.html#res-partial-view-options-).
### Template Engines
Below are a few template engines commonly used with Express:
* [Jade](http://github.com/visionmedia/jade) haml.js successor
* [Haml](http://github.com/visionmedia/haml.js) indented templates
* [Jade](http://jade-lang.com) haml.js successor
* [Haml](http://github.com/visionmedia/haml.js) pythonic indented templates
* [EJS](http://github.com/visionmedia/ejs) Embedded JavaScript
* [CoffeeKup](http://github.com/mauricemach/coffeekup) CoffeeScript based templating
* [Eco](http://github.com/sstephenson/eco) Embedded CoffeeScript
* [jQuery Templates](https://github.com/kof/node-jqtpl) for node
### Session Support
Sessions support can be added by using Connect's _session_ middleware. To do so we also need the _cookieDecoder_ middleware place above it, which will parse and populate cookie data to _req.cookies_. The session middleware requires only a `secret`.
app.use(express.cookieDecoder());
app.use(express.session({ secret: 'keyboard cat' }));
By default the _session_ middleware uses the memory store bundled with Connect, however many implementations exist. For example [connect-redis](http://github.com/visionmedia/connect-redis) supplies a [Redis](http://code.google.com/p/redis/) session store and can be used as shown below:
var RedisStore = require('connect-redis');
app.use(express.cookieDecoder());
app.use(express.session({ store: new RedisStore, secret: 'keyboard cat' }));
Now the _req.session_ and _req.sessionStore_ properties will be accessible to all routes and subsequent middleware. Properties on _req.session_ are automatically saved on a response, so for example if we wish to shopping cart data:
var RedisStore = require('connect-redis');
app.use(express.bodyDecoder());
app.use(express.cookieDecoder());
app.use(express.session({ store: new RedisStore, secret: 'keyboard cat' }));
app.post('/add-to-cart', function(req, res){
// Perhaps we posted several items with a form
// (use the bodyDecoder() middleware for this)
var items = req.body.items;
req.session.items = items;
res.redirect('back');
});
app.get('/add-to-cart', function(req, res){
// When redirected back to GET /add-to-cart
// we could check req.session.items && req.session.items.length
// to print out a message
if (req.session.items && req.session.items.length) {
req.flash('info', 'You have %s items in your cart', req.session.items.length);
}
res.render('shopping-cart');
});
The _req.session_ object also has methods such as _Session#touch()_, _Session#destroy()_, _Session#regenerate()_ among others to maintain and manipulate sessions. For more information view the [Connect Session](http://senchalabs.github.com/connect/session.html) documentation.
### Migration Guide
Pre-beta Express developers may reference the [Migration Guide](migrate.html) to get up to speed on how to upgrade your application.
### req.header(key[, defaultValue])
@@ -303,21 +596,70 @@ to "text/html" using the mime lookup table.
req.accepts('png');
// => false
### req.is(type)
Check if the incoming request contains the _Content-Type_
header field, and it contains the give mime _type_.
// With Content-Type: text/html; charset=utf-8
req.is('html');
req.is('text/html');
// => true
// When Content-Type is application/json
req.is('json');
req.is('application/json');
// => true
req.is('html');
// => false
Ad-hoc callbacks can also be registered with Express, to perform
assertions again the request, for example if we need an expressive
way to check if our incoming request is an image, we can register _"an image"_
callback:
app.is('an image', function(req){
return 0 == req.headers['content-type'].indexOf('image');
});
Now within our route callbacks, we can use to to assert content types
such as _"image/jpeg"_, _"image/png"_, etc.
app.post('/image/upload', function(req, res, next){
if (req.is('an image')) {
// do something
} else {
next();
}
});
Keep in mind this method is _not_ limited to checking _Content-Type_, you
can perform any request assertion you wish.
Wildcard matches can also be made, simplifying our example above for _"an image"_, by asserting the _subtype_ only:
req.is('image/*');
We may also assert the _type_ as shown below, which would return true for _"application/json"_, and _"text/json"_.
req.is('*/json');
### req.param(name)
Return the value of param _name_ when present.
- Checks route placeholders, ex: /user/:id
- Checks query string params, ex: ?id=12
- Checks urlencoded body params, ex: id=12
- Checks route placeholders (_req.params_), ex: /user/:id
- Checks query string params (_req.query_), ex: ?id=12
- Checks urlencoded body params (_req.body_), ex: id=12
To utilize urlencoded request bodies, _req.body_
should be an object. This can be done by using
the _connect.bodyDecoder_ middleware.
the _express.bodyDecoder_ middleware.
### req.flash(type[, msg])
Queue flash _msg_ of the given _type_.
Queue flash _msg_ of the given _type_. These messages are stored in the session (thus requiring the `session` middleware), enabling them to span one or more requests before flushing.
req.flash('info', 'email sent');
req.flash('error', 'email delivery failed');
@@ -333,6 +675,12 @@ Queue flash _msg_ of the given _type_.
req.flash();
// => { error: ['email delivery failed'], info: [] }
Flash notification message may also utilize formatters, by default only the %s string formatter is available:
req.flash('info', 'email delivery to _%s_ from _%s_ failed.', toUser, fromUser);
For HTML flash message check out the [express-contrib](https://github.com/visionmedia/express-contrib) library.
### req.isXMLHttpRequest
Also aliased as _req.xhr_, this getter checks the _X-Requested-With_ header
@@ -374,8 +722,17 @@ Used by `res.download()` to transfer an arbitrary file.
res.sendfile('path/to/my.file');
**NOTE**: this is _not_ a replacement for Connect's _staticProvider_ middleware,
nor does it perform any security checks, use with caution when using in a dynamic manor.
This method accepts a callback which when given will be called on an exception, as well as when the transfer has completed. When a callback is not given, and the file has __not__ been streamed, _next(err)_ will be called on an exception.
res.sendfile(path, function(err, path){
if (err) {
// handle the error
} else {
console.log('transferred %s', path);
}
});
When the filesize exceeds the _stream threshold_ (defaulting to 32k), the file will be streamed using _fs.ReadStream_ and _sys.pump()_.
### res.download(file[, filename])
@@ -395,6 +752,7 @@ The `res.send()` method is a high level response utility allowing you to pass
objects to respond with json, strings for html, arbitrary _Buffer_s or numbers for status
code based responses. The following are all valid uses:
res.send(); // 204
res.send(new Buffer('wahoo'));
res.send({ some: 'json' });
res.send('<p>some html</p>');
@@ -420,14 +778,115 @@ Express supports "redirect mapping", which by default provides _home_, and _back
The _back_ map checks the _Referrer_ and _Referer_ headers, while _home_ utilizes
the "home" setting and defaults to "/".
### res.cookie(name, val[, options])
Sets the given cookie _name_ to _val_, with _options_ such as "httpOnly: true", "expires", "secure" etc.
// "Remember me" for 15 minutes
res.cookie('rememberme', 'yes', { expires: new Date(Date.now() + 900000), httpOnly: true });
To parse incoming _Cookie_ headers, use the _cookieDecoder_ middleware, which provides the _req.cookies_ object:
app.use(express.cookieDecoder());
app.get('/', function(req, res){
// use req.cookies.rememberme
});
### res.clearCookie(name)
Clear cookie _name_ by setting "expires" far in the past.
res.clearCookie('rememberme');
### res.render(view[, options[, fn]])
Render _view_ with the given _options_ and optional callback _fn_.
When a callback function is given a response will _not_ be made
automatically, however otherwise a response of _200_ and _text/html_ is given.
Most engines accept one or more of the following options,
both [haml](http://github.com/visionmedia/haml.js) and [jade](http://github.com/visionmedia/jade) accept all:
- _scope_ Template evaluation context (value of _this_)
- _locals_ Object containing local variables
- _debug_ Output debugging information
- _status_ Response status code, defaults to 200
- _headers_ Response headers object
### res.partial(view[, options])
Render _view_ partial with the given _options_. This method is always available
to the view as a local variable.
- _object_ the object named by _as_ or derived from the view name
- _as_ Variable name for each _collection_ or _object_ value, defaults to the view name.
* as: 'something' will add the _something_ local variable
* as: this will use the collection value as the template context
* as: global will merge the collection value's properties with _locals_
- _collection_ Array of objects, the name is derived from the view name itself.
For example _video.html_ will have a object _video_ available to it.
The following are equivalent, and the name of collection value when passed
to the partial will be _movie_ as derived from the name.
partial('theatre/movie.jade', { collection: movies });
partial('theatre/movie.jade', movies);
partial('movie.jade', { collection: movies });
partial('movie.jade', movies);
partial('movie', movies);
// In view: movie.director
To change the local from _movie_ to _video_ we can use the "as" option:
partial('movie', { collection: movies, as: 'video' });
// In view: video.director
Also we can make our movie the value of _this_ within our view so that instead
of _movie.director_ we could use _this.director_.
partial('movie', { collection: movies, as: this });
// In view: this.director
Another alternative is to "explode" the properties of the collection item into
pseudo globals (local variables) by using _as: global_, which again is syntactic sugar:
partial('movie', { collection: movies, as: global });
// In view: director
This same logic applies to a single partial object usage:
partial('movie', { object: movie, as: this });
// In view: this.director
partial('movie', { object: movie, as: global });
// In view: director
partial('movie', { object: movie, as: 'video' });
// In view: video.director
partial('movie', { object: movie });
// In view: movie.director
When a non-collection (does _not_ have _.length_) is passed as the second argument, it is assumed to be the _object_, after which the object's local variable name is derived from the view name:
partial('movie', movie);
// => In view: movie.director
### app.set(name[, val])
Apply an application level setting _name_ to _val_, or
get the value of _name_ when _val_ is not present:
app.set('reload views', 200);
app.set('reload views');
// => 200
app.set('views', __dirname + '/views');
app.set('views');
// => ...path...
Alternatively you may simply access the settings via _app.settings_:
app.settings.views
// => ...path...
### app.enable(name)
@@ -469,8 +928,8 @@ Now in a route we may call:
We may also map dynamic redirects:
app.redirect('comments', function(req, res, params){
return '/post/' + params.id + '/comments';
app.redirect('comments', function(req, res){
return '/post/' + req.params.id + '/comments';
});
So now we may do the following, and the redirect will dynamically adjust to
@@ -491,6 +950,77 @@ should call _next(err)_ if it does not wish to deal with the exception:
res.send(err.message, 500);
});
### app.helpers(obj)
Registers static view helpers.
app.helpers({
name: function(first, last){ return first + ', ' + last },
firstName: 'tj',
lastName: 'holowaychuk'
});
Our view could now utilize the _firstName_ and _lastName_ variables,
as well as the _name()_ function exposed.
<%= name(firstName, lastName) %>
### app.dynamicHelpers(obj)
Registers dynamic view helpers. Dynamic view helpers
are simply functions which accept _req_, _res_, and are
evaluated against the _Server_ instance before a view is rendered. The _return value_ of this function
becomes the local variable it is associated with.
app.dynamicHelpers({
session: function(req, res){
return req.session;
}
});
All views would now have _session_ available so that session data can be accessed via _session.name_ etc:
<%= session.name %>
### app.mounted(fn)
Assign a callback _fn_ which is called when this _Server_ is passed to _Server#use()_.
var app = express.createServer(),
blog = express.createServer();
blog.mounted(function(parent){
// parent is app
// "this" is blog
});
app.use(blog);
### app.register(ext, exports)
Register the given template engine _exports_
as _ext_. For example we may wish to map ".html"
files to jade:
app.register('.html', require('jade'));
This is also useful for libraries that may not
match extensions correctly. For example my haml.js
library is installed from npm as "hamljs" so instead
of layout.hamljs, we can register the engine as ".haml":
app.register('.haml', require('haml-js'));
For engines that do not comply with the Express
specification, we can also wrap their api this way.
app.register('.foo', {
render: function(str, options) {
// perhaps their api is
// return foo.toHTML(str, options);
}
});
### app.listen([port[, host]])
Bind the app server to the given _port_, which defaults to 3000. When _host_ is omitted all
Arquivo binário não exibido.

Depois

Largura:  |  Altura:  |  Tamanho: 108 KiB

Arquivo binário não exibido.

Depois

Largura:  |  Altura:  |  Tamanho: 159 KiB

Arquivo binário não exibido.

Depois

Largura:  |  Altura:  |  Tamanho: 145 KiB

Arquivo binário não exibido.

Depois

Largura:  |  Altura:  |  Tamanho: 145 KiB

Arquivo binário não exibido.

Depois

Largura:  |  Altura:  |  Tamanho: 154 KiB

Arquivo binário não exibido.

Depois

Largura:  |  Altura:  |  Tamanho: 181 KiB

Arquivo binário não exibido.

Depois

Largura:  |  Altura:  |  Tamanho: 200 KiB

Arquivo binário não exibido.

Depois

Largura:  |  Altura:  |  Tamanho: 236 KiB

Arquivo binário não exibido.

Depois

Largura:  |  Altura:  |  Tamanho: 112 KiB

Arquivo binário não exibido.

Depois

Largura:  |  Altura:  |  Tamanho: 88 KiB

Arquivo binário não exibido.

Depois

Largura:  |  Altura:  |  Tamanho: 127 KiB

+31 -10
Ver Arquivo
@@ -1,7 +1,10 @@
.\" generated with Ronn/v0.6.6
.\" http://github.com/rtomayko/ronn/
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "INDEX" "" "July 2010" "" ""
.TH "INDEX" "" "October 2010" "" ""
.
.SH "NAME"
\fBindex\fR
.
.IP "" 4
.
@@ -28,6 +31,15 @@ Robust routing
Redirection helpers
.
.IP "\(bu" 4
Dynamic view helpers
.
.IP "\(bu" 4
Application level view options
.
.IP "\(bu" 4
Content negotiation
.
.IP "\(bu" 4
Focus on high performance
.
.IP "\(bu" 4
@@ -40,11 +52,14 @@ Environment based configuration
Session based flash notifications
.
.IP "\(bu" 4
Built on Connect \fIhttp://extjs\.github\.com/Connect\fR
Built on Connect \fIhttp://github\.com/senchalabs/connect\fR
.
.IP "\(bu" 4
Executable \fIexecutable\.html\fR for generating applications quickly
.
.IP "\(bu" 4
High test coverage
.
.IP "" 0
.
.SH "Contributors"
@@ -59,6 +74,9 @@ Ciaran Jessup (ciaranj \fIhttp://github\.com/ciaranj\fR)
.IP "\(bu" 4
Aaron Heckmann (aheckmann \fIhttp://github\.com/aheckmann\fR)
.
.IP "\(bu" 4
Guillermo Rauch (guille \fIhttp://github\.com/guille\fR)
.
.IP "" 0
.
.SH "More Information"
@@ -73,13 +91,16 @@ Follow tjholowaychuk \fIhttp://twitter\.com/tjholowaychuk\fR on twitter for upda
Annotated source documentation \fIapi\.html\fR
.
.IP "\(bu" 4
View the Connect \fIhttp://github\.com/senchalabs/connect\fR repo for middleware usage
.
.IP "\(bu" 4
View the Connect Wiki \fIhttp://wiki\.github\.com/senchalabs/connect/\fR for contrib middleware
.
.IP "\(bu" 4
View the examples \fIhttp://github\.com/visionmedia/express/tree/master/examples/\fR
.
.IP "\(bu" 4
View the source \fIhttp://github\.com/visionmedia/express\fR
.
.IP "\(bu" 4
View the Connect \fIhttp://github\.com/extjs/Connect\fR repo for middleware usage
.
.IP "\(bu" 4
View the Connect Wiki \fIhttp://wiki\.github\.com/extjs/Connect/\fR for contrib middleware
.
.IP "" 0
+47 -24
Ver Arquivo
@@ -1,20 +1,8 @@
<html>
<head>
<title>Express - node web framework</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<style>
#header {
position: absolute;
top: 10px;
left: 0;
padding: 12px 0;
text-indent: 40px;
width: 100%;
border-top: 1px solid rgba(0,0,0,0.7);
border-bottom: 1px solid rgba(0,0,0,0.7);
background: rgba(255,255,255,0.1) url(http://www.sencha.com/favicon.ico) no-repeat 15px 50%;
text-align: left;
color: #fff;
}
#tagline {
margin-left: 75px;
margin-bottom: 30px;
@@ -28,8 +16,7 @@
font: 14px/1.4 "Helvetica Neue", "Lucida Grande", "Arial";
font-size: 14px;
line-height: 1.5;
-webkit-text-stroke: 1px rgba(0, 0, 0, 0.1);
-moz-text-stroke: 1px rgba(0, 0, 0, 0.1);
-webkit-font-smoothing: antialiased;
background: url(images/bg.jpg) 50% 0 no-repeat;
color: #8b8b8b; }
@@ -52,13 +39,17 @@
a:hover {
opacity: 0.8; }
h1, h2, h3 {
h1, h2, h3, h4 {
margin: 45px 0 0 0;
color: white;
text-shadow: 1px 2px 2px rgba(0,0,0,0.6); }
h3 {
font-size: 18px; }
h4 {
margin-left: 10px;
font-size: 14px;
}
pre {
margin: 20px 10px;
@@ -80,9 +71,19 @@
margin: 0;
padding: 2px 0;
list-style: square; }
ul li ul {
margin: 0;
padding-left: 12px;
}
.man-name, #Express { display:none; }
.sect {
margin-left: 40px; }
img {
margin-left: 20px;
margin-bottom: 15px;
}
#logo {
display: block;
@@ -110,21 +111,22 @@
#container {
margin: 0 auto;
padding-top: 110px;
padding-top: 80px;
width: 550px; }
#toc {
position: fixed;
top: 60px;
top: 0;
left: 0;
margin: 0 0 0 15px;
padding: 15px;
height: 100%;
background: rgba(0,0,0,0.2);
overflow: auto;
border-right: 1px solid rgba(255,255,255,0.05);
}
#toc li {
padding: 1px 0;
padding: 0;
list-style: none;
}
#toc li a {
@@ -158,12 +160,23 @@
-webkit-box-shadow: 1px 1px 1px rgba(0,0,0,0.4);
-moz-box-shadow: 1px 1px 1px rgba(0,0,0,0.4); }
</style>
<script>
$(function(){
$('.section').hide();
$('.toggle, a.section-title').toggle(function(){
$(this).siblings('ul').fadeIn(300);
return false;
}, function(){
$(this).siblings('ul').fadeOut(300);
return false;
});
});
</script>
</head>
<body>
<a href='http://github.com/visionmedia/express'>
<img alt='Fork me on GitHub' id='ribbon' src='http://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png' />
</a>
<div id="header"><strong>Sencha</strong> labs</div>
<div id="wrapper">
<div id="container">
<a href='http://github.com/visionmedia/express' id='logo'>Express</a>
@@ -175,9 +188,13 @@
<li><a href="index.html">Home</a></li>
<li><a href="guide.html">Guide</a></li>
<li><a href="contrib.html">Contributing</a></li>
<li><a href="migrate.html">1.x Migration</a></li>
<li><a href="applications.html">Applications</a></li>
</ul>
<div class='mp'>
<h2 id="Express">Express</h2>
<p class="man-name">
<code>index</code>
</p>
<pre><code>var app = express.createServer();
app.get('/', function(req, res){
@@ -192,12 +209,16 @@ app.listen(3000);
<ul>
<li>Robust routing</li>
<li>Redirection helpers</li>
<li>Dynamic view helpers</li>
<li>Application level view options</li>
<li>Content negotiation</li>
<li>Focus on high performance</li>
<li>View rendering and partials support</li>
<li>Environment based configuration</li>
<li>Session based flash notifications</li>
<li>Built on <a href="http://extjs.github.com/Connect">Connect</a></li>
<li>Built on <a href="http://github.com/senchalabs/connect">Connect</a></li>
<li><a href="executable.html">Executable</a> for generating applications quickly</li>
<li>High test coverage</li>
</ul>
@@ -209,6 +230,7 @@ app.listen(3000);
<li>TJ Holowaychuk (<a href="http://github.com/visionmedia">visionmedia</a>)</li>
<li>Ciaran Jessup (<a href="http://github.com/ciaranj">ciaranj</a>)</li>
<li>Aaron Heckmann (<a href="http://github.com/aheckmann">aheckmann</a>)</li>
<li>Guillermo Rauch (<a href="http://github.com/guille">guille</a>)</li>
</ul>
@@ -218,9 +240,10 @@ app.listen(3000);
<li><a href="http://groups.google.com/group/express-js">Google Group</a> for discussion</li>
<li>Follow <a href="http://twitter.com/tjholowaychuk">tjholowaychuk</a> on twitter for updates</li>
<li>Annotated source <a href="api.html">documentation</a></li>
<li>View the <a href="http://github.com/senchalabs/connect">Connect</a> repo for middleware usage</li>
<li>View the <a href="http://wiki.github.com/senchalabs/connect/">Connect Wiki</a> for contrib middleware</li>
<li>View the <a href="http://github.com/visionmedia/express/tree/master/examples/">examples</a></li>
<li>View the <a href="http://github.com/visionmedia/express">source</a></li>
<li>View the <a href="http://github.com/extjs/Connect">Connect</a> repo for middleware usage</li>
<li>View the <a href="http://wiki.github.com/extjs/Connect/">Connect Wiki</a> for contrib middleware</li>
</ul>
+9 -3
Ver Arquivo
@@ -11,12 +11,16 @@
* Robust routing
* Redirection helpers
* Dynamic view helpers
* Application level view options
* Content negotiation
* Focus on high performance
* View rendering and partials support
* Environment based configuration
* Session based flash notifications
* Built on [Connect](http://extjs.github.com/Connect)
* Built on [Connect](http://github.com/senchalabs/connect)
* [Executable](executable.html) for generating applications quickly
* High test coverage
## Contributors
@@ -25,12 +29,14 @@ The following are the major contributors of Express (in no specific order).
* TJ Holowaychuk ([visionmedia](http://github.com/visionmedia))
* Ciaran Jessup ([ciaranj](http://github.com/ciaranj))
* Aaron Heckmann ([aheckmann](http://github.com/aheckmann))
* Guillermo Rauch ([guille](http://github.com/guille))
## More Information
* [Google Group](http://groups.google.com/group/express-js) for discussion
* Follow [tjholowaychuk](http://twitter.com/tjholowaychuk) on twitter for updates
* Annotated source [documentation](api.html)
* View the [Connect](http://github.com/senchalabs/connect) repo for middleware usage
* View the [Connect Wiki](http://wiki.github.com/senchalabs/connect/) for contrib middleware
* View the [examples](http://github.com/visionmedia/express/tree/master/examples/)
* View the [source](http://github.com/visionmedia/express)
* View the [Connect](http://github.com/extjs/Connect) repo for middleware usage
* View the [Connect Wiki](http://wiki.github.com/extjs/Connect/) for contrib middleware
+34 -21
Ver Arquivo
@@ -1,20 +1,8 @@
<html>
<head>
<title>Express - node web framework</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<style>
#header {
position: absolute;
top: 10px;
left: 0;
padding: 12px 0;
text-indent: 40px;
width: 100%;
border-top: 1px solid rgba(0,0,0,0.7);
border-bottom: 1px solid rgba(0,0,0,0.7);
background: rgba(255,255,255,0.1) url(http://www.sencha.com/favicon.ico) no-repeat 15px 50%;
text-align: left;
color: #fff;
}
#tagline {
margin-left: 75px;
margin-bottom: 30px;
@@ -28,8 +16,7 @@
font: 14px/1.4 "Helvetica Neue", "Lucida Grande", "Arial";
font-size: 14px;
line-height: 1.5;
-webkit-text-stroke: 1px rgba(0, 0, 0, 0.1);
-moz-text-stroke: 1px rgba(0, 0, 0, 0.1);
-webkit-font-smoothing: antialiased;
background: url(images/bg.jpg) 50% 0 no-repeat;
color: #8b8b8b; }
@@ -52,13 +39,17 @@
a:hover {
opacity: 0.8; }
h1, h2, h3 {
h1, h2, h3, h4 {
margin: 45px 0 0 0;
color: white;
text-shadow: 1px 2px 2px rgba(0,0,0,0.6); }
h3 {
font-size: 18px; }
h4 {
margin-left: 10px;
font-size: 14px;
}
pre {
margin: 20px 10px;
@@ -80,9 +71,19 @@
margin: 0;
padding: 2px 0;
list-style: square; }
ul li ul {
margin: 0;
padding-left: 12px;
}
.man-name, #Express { display:none; }
.sect {
margin-left: 40px; }
img {
margin-left: 20px;
margin-bottom: 15px;
}
#logo {
display: block;
@@ -110,21 +111,22 @@
#container {
margin: 0 auto;
padding-top: 110px;
padding-top: 80px;
width: 550px; }
#toc {
position: fixed;
top: 60px;
top: 0;
left: 0;
margin: 0 0 0 15px;
padding: 15px;
height: 100%;
background: rgba(0,0,0,0.2);
overflow: auto;
border-right: 1px solid rgba(255,255,255,0.05);
}
#toc li {
padding: 1px 0;
padding: 0;
list-style: none;
}
#toc li a {
@@ -158,12 +160,23 @@
-webkit-box-shadow: 1px 1px 1px rgba(0,0,0,0.4);
-moz-box-shadow: 1px 1px 1px rgba(0,0,0,0.4); }
</style>
<script>
$(function(){
$('.section').hide();
$('.toggle, a.section-title').toggle(function(){
$(this).siblings('ul').fadeIn(300);
return false;
}, function(){
$(this).siblings('ul').fadeOut(300);
return false;
});
});
</script>
</head>
<body>
<a href='http://github.com/visionmedia/express'>
<img alt='Fork me on GitHub' id='ribbon' src='http://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png' />
</a>
<div id="header"><strong>Sencha</strong> labs</div>
<div id="wrapper">
<div id="container">
<a href='http://github.com/visionmedia/express' id='logo'>Express</a>
@@ -175,5 +188,5 @@
<li><a href="index.html">Home</a></li>
<li><a href="guide.html">Guide</a></li>
<li><a href="contrib.html">Contributing</a></li>
<li><a href="migrate.html">1.x Migration</a></li>
<li><a href="applications.html">Applications</a></li>
</ul>
+18 -18
Ver Arquivo
@@ -1,7 +1,10 @@
.\" generated with Ronn/v0.6.6
.\" http://github.com/rtomayko/ronn/
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "MIGRATE" "" "July 2010" "" ""
.TH "MIGRATE" "" "October 2010" "" ""
.
.SH "NAME"
\fBmigrate\fR
.
.SS "Built On Connect"
Express 1\.x is written to run on\-top of the Connect \fIhttp://extjs\.github\.com/Connect\fR middlware framework, thus the \fIPlugin\fR has been replaced by Connect\'s middleware\. By abstracting our middleware to Connect we allow additional community frameworks to develop robust, high\-level frameworks using the same technologies as Express\.
@@ -74,12 +77,10 @@ Which we can now \fIuse()\fR within our app, or pass to the \fIexpress\.createSe
.
.nf
var connect = require(\'connect\');
var app = express\.createServer(
connect\.logger(),
connect\.methodOverride(),
connect\.cookie()
express\.logger(),
express\.methodOverride(),
express\.cookieDecoder()
);
.
.fi
@@ -93,12 +94,11 @@ or:
.
.nf
var connect = require(\'connect\');
var app = express\.createServer();
app\.use(\'/\', connect\.logger());
app\.use(\'/\', connect\.methodOverride());
app\.use(\'/\', connect\.cookieDecoder());
app\.use(express\.logger());
app\.use(express\.methodOverride());
app\.use(express\.cookieDecoder());
.
.fi
.
@@ -156,7 +156,7 @@ Polymorphic parameter access can be done using \fBreq\.param()\fR:
.
.nf
app\.get(\'/user/:id\', function(){
app\.get(\'/user/:id\', function(req, res){
req\.param(\'id\');
});
.
@@ -165,14 +165,14 @@ app\.get(\'/user/:id\', function(){
.IP "" 0
.
.P
Route parameters are also passed as the third argument:
Route parameters are available via \fBreq\.params\fR:
.
.IP "" 4
.
.nf
app\.get(\'/user/:id\', function(req, res, params){
params\.id;
app\.get(\'/user/:id\', function(req, res){
req\.params\.id;
});
.
.fi
@@ -195,13 +195,13 @@ get(\'/\', function(){
.IP "" 0
.
.P
Now Express has access to Connect\'s \fInext()\fR function, which is passed as the fourth and final argument\. Calling \fInext()\fR will pass control to the next \fImatching route\fR, or continue down the stack of Connect middleware\.
Now Express has access to Connect\'s \fInext()\fR function, which is passed as the third and final argument\. Calling \fInext()\fR will pass control to the next \fImatching route\fR, or continue down the stack of Connect middleware\.
.
.IP "" 4
.
.nf
app\.get(\'/user/:id?\', function(req, res, params, next){
app\.get(\'/user/:id?\', function(req, res, next){
next();
});
+52 -38
Ver Arquivo
@@ -1,20 +1,8 @@
<html>
<head>
<title>Express - node web framework</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<style>
#header {
position: absolute;
top: 10px;
left: 0;
padding: 12px 0;
text-indent: 40px;
width: 100%;
border-top: 1px solid rgba(0,0,0,0.7);
border-bottom: 1px solid rgba(0,0,0,0.7);
background: rgba(255,255,255,0.1) url(http://www.sencha.com/favicon.ico) no-repeat 15px 50%;
text-align: left;
color: #fff;
}
#tagline {
margin-left: 75px;
margin-bottom: 30px;
@@ -28,8 +16,7 @@
font: 14px/1.4 "Helvetica Neue", "Lucida Grande", "Arial";
font-size: 14px;
line-height: 1.5;
-webkit-text-stroke: 1px rgba(0, 0, 0, 0.1);
-moz-text-stroke: 1px rgba(0, 0, 0, 0.1);
-webkit-font-smoothing: antialiased;
background: url(images/bg.jpg) 50% 0 no-repeat;
color: #8b8b8b; }
@@ -52,13 +39,17 @@
a:hover {
opacity: 0.8; }
h1, h2, h3 {
h1, h2, h3, h4 {
margin: 45px 0 0 0;
color: white;
text-shadow: 1px 2px 2px rgba(0,0,0,0.6); }
h3 {
font-size: 18px; }
h4 {
margin-left: 10px;
font-size: 14px;
}
pre {
margin: 20px 10px;
@@ -80,9 +71,19 @@
margin: 0;
padding: 2px 0;
list-style: square; }
ul li ul {
margin: 0;
padding-left: 12px;
}
.man-name, #Express { display:none; }
.sect {
margin-left: 40px; }
img {
margin-left: 20px;
margin-bottom: 15px;
}
#logo {
display: block;
@@ -110,21 +111,22 @@
#container {
margin: 0 auto;
padding-top: 110px;
padding-top: 80px;
width: 550px; }
#toc {
position: fixed;
top: 60px;
top: 0;
left: 0;
margin: 0 0 0 15px;
padding: 15px;
height: 100%;
background: rgba(0,0,0,0.2);
overflow: auto;
border-right: 1px solid rgba(255,255,255,0.05);
}
#toc li {
padding: 1px 0;
padding: 0;
list-style: none;
}
#toc li a {
@@ -158,12 +160,23 @@
-webkit-box-shadow: 1px 1px 1px rgba(0,0,0,0.4);
-moz-box-shadow: 1px 1px 1px rgba(0,0,0,0.4); }
</style>
<script>
$(function(){
$('.section').hide();
$('.toggle, a.section-title').toggle(function(){
$(this).siblings('ul').fadeIn(300);
return false;
}, function(){
$(this).siblings('ul').fadeOut(300);
return false;
});
});
</script>
</head>
<body>
<a href='http://github.com/visionmedia/express'>
<img alt='Fork me on GitHub' id='ribbon' src='http://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png' />
</a>
<div id="header"><strong>Sencha</strong> labs</div>
<div id="wrapper">
<div id="container">
<a href='http://github.com/visionmedia/express' id='logo'>Express</a>
@@ -175,9 +188,13 @@
<li><a href="index.html">Home</a></li>
<li><a href="guide.html">Guide</a></li>
<li><a href="contrib.html">Contributing</a></li>
<li><a href="migrate.html">1.x Migration</a></li>
<li><a href="applications.html">Applications</a></li>
</ul>
<div class='mp'>
<h2 id="Express">Express</h2>
<p class="man-name">
<code>migrate</code>
</p>
<h3 id="Built-On-Connect">Built On Connect</h3>
<p>Express 1.x is written to run on-top of the <a href="http://extjs.github.com/Connect">Connect</a> middlware
@@ -233,23 +250,20 @@ use(Cookie);
<p>Which we can now <em>use()</em> within our app, or pass to the <em>express.createServer()</em> method:</p>
<pre><code>var connect = require('connect');
var app = express.createServer(
connect.logger(),
connect.methodOverride(),
connect.cookie()
<pre><code>var app = express.createServer(
express.logger(),
express.methodOverride(),
express.cookieDecoder()
);
</code></pre>
<p>or:</p>
<pre><code>var connect = require('connect');
var app = express.createServer();
<pre><code>var app = express.createServer();
app.use('/', connect.logger());
app.use('/', connect.methodOverride());
app.use('/', connect.cookieDecoder());
app.use(express.logger());
app.use(express.methodOverride());
app.use(express.cookieDecoder());
</code></pre>
<p>For documentation on creating Connect middleware visit <a href="http://extjs.github.com/Connect/#Middleware-Authoring">Middleware Authoring</a>.</p>
@@ -280,15 +294,15 @@ fetching a route, query string, or request body parameter:</p>
<p>Polymorphic parameter access can be done using <code>req.param()</code>:</p>
<pre><code>app.get('/user/:id', function(){
<pre><code>app.get('/user/:id', function(req, res){
req.param('id');
});
</code></pre>
<p>Route parameters are also passed as the third argument:</p>
<p>Route parameters are available via <code>req.params</code>:</p>
<pre><code>app.get('/user/:id', function(req, res, params){
params.id;
<pre><code>app.get('/user/:id', function(req, res){
req.params.id;
});
</code></pre>
@@ -304,11 +318,11 @@ implemented for practical use:</p>
</code></pre>
<p>Now Express has access to Connect's <em>next()</em> function,
which is passed as the fourth and final argument. Calling <em>next()</em> will
which is passed as the third and final argument. Calling <em>next()</em> will
pass control to the next <em>matching route</em>, or continue down the stack
of Connect middleware.</p>
<pre><code>app.get('/user/:id?', function(req, res, params, next){
<pre><code>app.get('/user/:id?', function(req, res, next){
next();
});
+12 -15
Ver Arquivo
@@ -51,22 +51,19 @@ similar to below:
Which we can now _use()_ within our app, or pass to the _express.createServer()_ method:
var connect = require('connect');
var app = express.createServer(
connect.logger(),
connect.methodOverride(),
connect.cookie()
express.logger(),
express.methodOverride(),
express.cookieDecoder()
);
or:
var connect = require('connect');
var app = express.createServer();
app.use('/', connect.logger());
app.use('/', connect.methodOverride());
app.use('/', connect.cookieDecoder());
app.use(express.logger());
app.use(express.methodOverride());
app.use(express.cookieDecoder());
For documentation on creating Connect middleware visit [Middleware Authoring](http://extjs.github.com/Connect/#Middleware-Authoring).
@@ -93,14 +90,14 @@ fetching a route, query string, or request body parameter:
Polymorphic parameter access can be done using `req.param()`:
app.get('/user/:id', function(){
app.get('/user/:id', function(req, res){
req.param('id');
});
Route parameters are also passed as the third argument:
Route parameters are available via `req.params`:
app.get('/user/:id', function(req, res, params){
params.id;
app.get('/user/:id', function(req, res){
req.params.id;
});
### Passing Route Control
@@ -114,11 +111,11 @@ implemented for practical use:
});
Now Express has access to Connect's _next()_ function,
which is passed as the fourth and final argument. Calling _next()_ will
which is passed as the third and final argument. Calling _next()_ will
pass control to the next _matching route_, or continue down the stack
of Connect middleware.
app.get('/user/:id?', function(req, res, params, next){
app.get('/user/:id?', function(req, res, next){
next();
});
+126
Ver Arquivo
@@ -0,0 +1,126 @@
// Expose modules in ./support for demo purposes
require.paths.unshift(__dirname + '/../../support');
/**
* Module dependencies.
*/
var express = require('../../lib/express'),
crypto = require('crypto');
var app = express.createServer();
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.bodyDecoder());
app.use(express.cookieDecoder());
app.use(express.session());
// Message helper, ideally we would use req.flash()
// however this is more light-weight for an example
app.dynamicHelpers({
message: function(req){
var err = req.session.error,
msg = req.session.success;
delete req.session.error;
delete req.session.success;
if (err) return '<p class="msg error">' + err + '</p>';
if (msg) return '<p class="msg success">' + msg + '</p>';
}
});
// Generate a salt for the user to prevent rainbow table attacks
var users = {
tj: {
name: 'tj',
salt: 'randomly-generated-salt',
pass: md5('foobar' + 'randomly-generated-salt')
}
};
// Used to generate a hash of the plain-text password + salt
function md5(str) {
return crypto.createHash('md5').update(str).digest('hex');
}
// Authenticate using our plain-object database of doom!
function authenticate(name, pass, fn) {
var user = users[name];
// query the db for the given username
if (!user) return fn(new Error('cannot find user'));
// apply the same algorithm to the POSTed password, applying
// the md5 against the pass / salt, if there is a match we
// found the user
if (user.pass == md5(pass + user.salt)) return fn(null, user);
// Otherwise password is invalid
fn(new Error('invalid password'));
}
function restrict(req, res, next) {
if (req.session.user) {
next();
} else {
req.session.error = 'Access denied!';
res.redirect('/login');
}
}
function accessLogger(req, res, next) {
console.log('/restricted accessed by %s', req.session.user.name);
next();
}
app.get('/', function(req, res){
res.redirect('/login');
});
app.get('/restricted', restrict, accessLogger, function(req, res){
res.send('Wahoo! restricted area');
});
app.get('/logout', function(req, res){
// destroy the user's session to log them out
// will be re-created next request
req.session.destroy(function(){
res.redirect('home');
});
});
app.get('/login', function(req, res){
if (req.session.user) {
req.session.success = 'Authenticated as ' + req.session.user.name
+ ' click to <a href="/logout">logout</a>. '
+ ' You may now access <a href="/restricted">/restricted</a>.';
}
res.render('login');
});
app.post('/login', function(req, res){
authenticate(req.body.username, req.body.password, function(err, user){
if (user) {
// Regenerate session when signing in
// to prevent fixation
req.session.regenerate(function(){
// Store the user's primary key
// in the session store to be retrieved,
// or in this case the entire user object
req.session.user = user;
res.redirect('back');
});
} else {
req.session.error = 'Authentication failed, please check your '
+ ' username and password.'
+ ' (use "tj" and "foobar")';
res.redirect('back');
}
});
});
app.listen(3000);
console.log('Express started on port 3000');
+21
Ver Arquivo
@@ -0,0 +1,21 @@
<!DOCTYPE html>
<html>
<head>
<title>Authentication Example</title>
<style>
body {
padding: 50px;
font: 13px Helvetica, Arial, sans-serif;
}
.error {
color: red
}
.success {
color: green;
}
</style>
</head>
<body>
<%- body %>
</body>
</html>
+16
Ver Arquivo
@@ -0,0 +1,16 @@
<h1>Login</h1>
<%- message %>
Try accessing <a href="/restricted">/restricted</a>.
<form method="post" action="/login">
<p>
<label>Username:</label>
<input type="text" name="username">
</p>
<p>
<label>Password:</label>
<input type="text" name="password">
</p>
<p>
<input type="submit" value="Login">
</p>
</form>
+25
Ver Arquivo
@@ -0,0 +1,25 @@
// Expose modules in ./support for demo purposes
require.paths.unshift(__dirname + '/../../support');
/**
* Module dependencies.
*/
var express = require('./../../lib/express');
// Our app IS the exports, this prevents require('./app').app,
// instead it is require('./app');
var app = module.exports = express.createServer();
// Illustrates that an app can be broken into
// several files, but yet extend the same app
require('./main');
require('./contact');
// Illustrates that one app (Server instance) can
// be "mounted" to another at the given route.
app.use('/blog', require('./blog'));
app.listen(3000);
console.log('Express started on port 3000');
+45
Ver Arquivo
@@ -0,0 +1,45 @@
/**
* Module dependencies.
*/
var express = require('./../../../lib/express'),
fs = require('fs');
// Export our app as the module
var app = module.exports = express.createServer();
// Set views directory
app.set('views', __dirname + '/views');
// Load our posts
var posts = JSON.parse(fs.readFileSync(__dirname + '/posts.json', 'utf8'));
// Set our default view engine to "ejs"
app.set('view engine', 'ejs');
app.dynamicHelpers({
basepath: function(){
// "this" is the app, we can
// dynamically provide the "home"
// setting to all views
return this.set('home');
}
});
app.get('/', function(req, res){
res.render('index', {
locals: {
posts: posts
}
});
});
app.get('/post/:id', function(req, res){
var id = req.params.id;
res.render('post', {
locals: {
post: posts[id]
}
});
});
+4
Ver Arquivo
@@ -0,0 +1,4 @@
[
{ "id": 0, "title": "Post one", "body": "Just some lame post" },
{ "id": 1, "title": "Post two", "body": "Just another lame post" }
]
+2
Ver Arquivo
@@ -0,0 +1,2 @@
<h2>Posts</h2>
<%- partial('post', { collection: posts, as: global }) %>
+9
Ver Arquivo
@@ -0,0 +1,9 @@
<html>
<head>
<title>Blog Example</title>
</head>
<body>
<h1>Best Blog Ever</h1>
<%- body %>
</body>
</html>
+2
Ver Arquivo
@@ -0,0 +1,2 @@
<h3><a href="<%= basepath %>/post/<%= id %>"><%= title %></a></h3>
<p><%= body %></p>
+1
Ver Arquivo
@@ -0,0 +1 @@
<%- partial('post', { object: post, as: global }) %>
+9
Ver Arquivo
@@ -0,0 +1,9 @@
// in ./app.js we did "module.exports", allowing
// us to grab the app from the parent module (the one
// which required it)
var app = module.parent.exports;
app.get('/contact', function(req, res){
res.send('<p>Wahoo contact page</p>');
});
+10
Ver Arquivo
@@ -0,0 +1,10 @@
// in ./app.js we did "module.exports", allowing
// us to grab the app from the parent module (the one
// which required it)
var app = module.parent.exports;
app.get('/', function(req, res){
res.send('<p>Visit <a href="/blog">/blog</a>'
+ ' or <a href="/contact">/contact</a></p>');
});
+46
Ver Arquivo
@@ -0,0 +1,46 @@
/**
* Module dependencies.
*/
var express = require('./../../lib/express');
var app = express.createServer(
// Place default Connect favicon above logger so it is not in
// the logging output
express.favicon(),
// Custom logger format
express.logger({ format: '\x1b[1m:method\x1b[0m \x1b[33m:url\x1b[0m :response-time' }),
// Provides req.cookies
express.cookieDecoder(),
// Parses x-www-form-urlencoded request bodies (and json)
express.bodyDecoder()
);
app.get('/', function(req, res){
if (req.cookies.remember) {
res.send('Remembered :). Click to <a href="/forget">forget</a>!.');
} else {
res.send('<form method="post"><p>Check to <label>'
+ '<input type="checkbox" name="remember"/> remember me</label> '
+ '<input type="submit" value="Submit"/>.</p></form>');
}
});
app.get('/forget', function(req, res){
res.clearCookie('remember');
res.redirect('back');
});
app.post('/', function(req, res){
if (req.body.remember) {
res.cookie('remember', '1', { path: '/', expires: new Date(Date.now() + 900000), httpOnly: true });
}
res.redirect('back');
});
app.listen(3000);
console.log('Express started on port 3000');
+32
Ver Arquivo
@@ -0,0 +1,32 @@
/**
* Module dependencies.
*/
var express = require('./../../lib/express');
var app = express.createServer();
app.get('/', function(req, res){
res.send('<ul>'
+ '<li>Download <a href="/files/amazing.txt">amazing.txt</a>.</li>'
+ '<li>Download <a href="/files/missing.txt">missing.txt</a>.</li>'
+ '</ul>');
});
app.get('/files/*', function(req, res){
var file = req.params[0];
res.download(__dirname + '/files/' + file);
});
app.error(function(err, req, res, next){
if (process.ENOENT == err.errno) {
res.send('Cant find that file, sorry!');
} else {
// Not a 404
next(err);
}
});
app.listen(3000);
console.log('Express started on port 3000');
+1
Ver Arquivo
@@ -0,0 +1 @@
wow supes cool are you glad you downloaded this?
+3
Ver Arquivo
@@ -1,4 +1,7 @@
// Expose modules in ./support for demo purposes
require.paths.unshift(__dirname + '/../../support');
/**
* Module dependencies.
*/
+103
Ver Arquivo
@@ -0,0 +1,103 @@
// Expose modules in ./support for demo purposes
require.paths.unshift(__dirname + '/../../support');
/**
* Module dependencies.
*/
var express = require('./../../lib/express');
var app = express.createServer(),
sys = require('sys');
// Serve default connect favicon
app.use(express.favicon());
// Logger is placed below favicon, so favicon.ico
// requests will not be logged
app.use(express.logger({ format: '":method :url" :status' }));
// "app.router" positions our routes
// specifically above the middleware
// assigned below
app.use(app.router);
// When no more middleware require execution, aka
// our router is finished and did not respond, we
// can assume that it is "not found". Instead of
// letting Connect deal with this, we define our
// custom middleware here to simply pass a NotFound
// exception
app.use(function(req, res, next){
next(new NotFound(req.url));
});
app.set('views', __dirname + '/views');
// Provide our app with the notion of NotFound exceptions
function NotFound(path){
this.name = 'NotFound';
if (path) {
Error.call(this, 'Cannot find ' + path);
this.path = path;
} else {
Error.call(this, 'Not Found');
}
Error.captureStackTrace(this, arguments.callee);
}
sys.inherits(NotFound, Error);
// We can call app.error() several times as shown below.
// Here we check for an instanceof NotFound and show the
// 404 page, or we pass on to the next error handler.
// These handlers could potentially be defined within
// configure() blocks to provide introspection when
// in the development environment.
app.error(function(err, req, res, next){
if (err instanceof NotFound) {
res.render('404.jade', {
status: 404,
locals: {
error: err
}
});
} else {
next(err);
}
});
// Here we assume all errors as 500 for the simplicity of
// this demo, however you can choose whatever you like
app.error(function(err, req, res){
res.render('500.jade', {
status: 500,
locals: {
error: err
}
});
});
// Routes
app.get('/', function(req, res){
res.render('index.jade');
});
app.get('/404', function(req, res){
throw new NotFound;
});
app.get('/500', function(req, res, next){
next(new Error('keyboard cat!'));
});
app.listen(3000);
console.log('Express app started on port 3000');
+4
Ver Arquivo
@@ -0,0 +1,4 @@
- if (error.path)
h2 Cannot find #{error.path}
- else
h2 Page Not Found
+3 -4
Ver Arquivo
@@ -3,8 +3,7 @@
* Module dependencies.
*/
var express = require('./../../lib/express'),
connect = require('connect');
var express = require('./../../lib/express');
var app = express.createServer();
@@ -13,7 +12,7 @@ app.get('/', function(req, res){
throw new Error('something broke!');
});
app.get('/next', function(req, res, params, next){
app.get('/next', function(req, res, next){
// We can also pass exceptions to next()
next(new Error('oh no!'))
});
@@ -21,6 +20,6 @@ app.get('/next', function(req, res, params, next){
// The errorHandler middleware in this case will dump exceptions to stderr
// as well as show the stack trace in responses, currently handles text/plain,
// text/html, and application/json responses to aid in development
app.use('/', connect.errorHandler({ dumpExceptions: true, showStack: true }));
app.use('/', express.errorHandler({ dumpExceptions: true, showStack: true }));
app.listen(3000);
+78
Ver Arquivo
@@ -0,0 +1,78 @@
// Expose modules in ./support for demo purposes
require.paths.unshift(__dirname + '/../../support');
/**
* Module dependencies.
*/
var express = require('../../lib/express');
// App with session support
var app = express.createServer(
express.cookieDecoder(),
express.session()
);
// View settings
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
// Dynamic helpers are functions which are executed
// on each view render, unless dynamicHelpers is false.
// So for example we do not need to call messages() in our
// template, "messages" will be populated with the return
// value of this function.
app.dynamicHelpers({
messages: function(req, res){
// In the case of flash messages
// we return a function, allowing
// flash messages to only be flushed
// when called, otherwise every request
// will flush flash messages regardless.
return function(){
// Grab the flash messages
var messages = req.flash();
// We will render the "messages.ejs" partial
return res.partial('messages', {
// Our target object is our messages
object: messages,
// We want it to be named "types" in the partial
// since they are keyed like this:
// { info: ['foo'], error: ['bar']}
as: 'types',
// Pass a local named "hasMessages" so we can easily
// check if we have any messages at all
locals: { hasMessages: Object.keys(messages).length },
// We dont want dynamicHelpers in this partial, as
// it would cause infinite recursion
dynamicHelpers: false
});
}
}
});
app.dynamicHelpers({
// Another dynamic helper example. Since dynamic
// helpers resolve at view rendering time, we can
// "inject" the "page" local variable per request
// providing us with the request url.
page: function(req, res){
return req.url;
}
});
app.get('/', function(req, res){
// Not very realistic notifications but illustrates usage
req.flash('info', 'email queued');
req.flash('info', 'email sent');
req.flash('error', 'delivery failed');
res.render('index');
});
app.listen(3000);
console.log('Express app started on port 3000');
+3
Ver Arquivo
@@ -0,0 +1,3 @@
<h1>Flash Message Example</h1>
<p>on page <%- page %></p>
<%- messages() %>
+5
Ver Arquivo
@@ -0,0 +1,5 @@
<html>
<body>
<%- body %>
</body>
</html>
+12
Ver Arquivo
@@ -0,0 +1,12 @@
<% if (hasMessages) { %>
<div id="messages">
<% for (var type in types) { %>
<h2><%= type %> messages</h2>
<ul id="<%= type %>">
<% types[type].forEach(function(msg){ %>
<li><%= msg %></li>
<% }) %>
</ul>
<% } %>
</div>
<% } %>
+46 -17
Ver Arquivo
@@ -4,20 +4,26 @@
*/
var express = require('./../../lib/express'),
connect = require('connect'),
sys = require('sys');
var app = express.createServer(
// Here we use the bodyDecoder middleware
// to parse urlencoded request bodies
// which populates req.body
connect.bodyDecoder(),
var app = express.createServer();
// Here we use the bodyDecoder middleware
// to parse urlencoded request bodies
// which populates req.body
app.use(express.bodyDecoder());
// The methodOverride middleware allows us
// to set a hidden input of _method to an arbitrary
// HTTP method to support app.put(), app.del() etc
connect.methodOverride()
);
// The methodOverride middleware allows us
// to set a hidden input of _method to an arbitrary
// HTTP method to support app.put(), app.del() etc
app.use(express.methodOverride());
// Required by session
app.use(express.cookieDecoder());
// Required by req.flash() for persistent
// notifications
app.use(express.session());
app.get('/', function(req, res){
// get ?name=foo
@@ -26,9 +32,26 @@ app.get('/', function(req, res){
// Switch the button label based if we have a name
var label = name ? 'Update' : 'Save';
// Buffer all flash messages.
// Typically this would all be done in a template
// however for illustration purposes we iterate
// here.
// The messages in req.flash() persist until called,
// at which time they are flushed from the session
var msgs = '<ul>',
flash = req.flash();
Object.keys(flash).forEach(function(type){
flash[type].forEach(function(msg){
msgs += '<li class="' + type + '">' + msg + '</li>';
});
});
msgs += '</ul>';
// If we have a name, we are updating,
// so add the hidden _method input
res.send('<form method="post">'
res.send(msgs
+ '<form method="post">'
+ (name ? '<input type="hidden" value="put" name="_method" />' : '')
+ 'Name: <input type="text" name="name" value="' + name + '" />'
+ '<input type="submit" value="' + label + '" />'
@@ -36,15 +59,21 @@ app.get('/', function(req, res){
});
app.post('/', function(req, res){
// Typically here we would create a resource
sys.puts('saved ' + req.body.name);
res.redirect('/?name=' + req.body.name);
if (req.body.name) {
// Typically here we would create a resource
req.flash('info', 'Saved ' + req.body.name);
res.redirect('/?name=' + req.body.name);
} else {
req.flash('error', 'Error: name required');
res.redirect('/');
}
});
app.put('/', function(req, res){
// Typically here we would update a resource
sys.puts('updated ' + req.body.name);
req.flash('info', 'Updated ' + req.body.name);
res.redirect('/?name=' + req.body.name);
});
app.listen(3000);
app.listen(3000);
console.log('Express app started on port 3000');
+63
Ver Arquivo
@@ -0,0 +1,63 @@
/**
* Module dependencies.
*/
var express = require('../../lib/express');
var app = express.createServer();
// Fake items
var items = [
{ name: 'foo' },
{ name: 'bar' },
{ name: 'baz' }
];
// Routes
app.get('/', function(req, res, next){
res.send('Visit /item/2');
});
app.get('/item/:id.:format?', function(req, res, next){
var id = req.params.id,
format = req.params.format,
item = items[id];
// Ensure item exists
if (item) {
// Serve the format
switch (format) {
case 'json':
// Detects json
res.send(item);
break;
case 'xml':
// Set contentType as xml then sends
// the string
var xml = ''
+ '<items>'
+ '<item>' + item.name + '</item>'
+ '</items>';
res.contentType('.xml');
res.send(xml);
break;
case 'html':
default:
// By default send some hmtl
res.send('<h1>' + item.name + '</h1>');
}
} else {
// We could simply pass route control and potentially 404
// by calling next(), or pass an exception like below.
next(new Error('Item ' + id + ' does not exist'));
}
});
// Middleware
app.use(express.errorHandler({ showStack: true }));
app.listen(3000);
console.log('Express app started on port 3000');
+28 -12
Ver Arquivo
@@ -1,10 +1,12 @@
// Expose modules in ./support for demo purposes
require.paths.unshift(__dirname + '/../../support');
/**
* Module dependencies.
*/
var express = require('./../../lib/express'),
connect = require('connect'),
http = require('http');
var app = express.createServer();
@@ -79,25 +81,39 @@ app.get('/', function(req, res){
* Display repos.
*/
app.get('/repos/:user', function(req, res, params, next){
var name = params.user;
request('/repos/show/' + name, function(err, user){
if (err) {
next(err)
app.get('/repos/*', function(req, res, next){
var names = req.params[0].split('/'),
users = [];
(function fetchData(name){
// We have a user name
if (name) {
console.log('... fetching \x1b[33m%s\x1b[0m', name);
request('/repos/show/' + name, function(err, user){
if (err) {
next(err)
} else {
user.totalWatchers = totalWatchers(user.repositories);
user.repos = sort(user.repositories);
user.name = name;
users.push(user);
fetchData(names.shift());
}
});
// No more users
} else {
console.log('... done');
res.render('index.jade', {
locals: {
totalWatchers: totalWatchers(user.repositories),
repos: sort(user.repositories),
name: name
users: users
}
});
}
});
})(names.shift());
});
// Serve statics from ./public
app.use('/', connect.staticProvider(__dirname + '/public'));
app.use(express.staticProvider(__dirname + '/public'));
// Listen on port 3000
app.listen(3000);
app.listen(3000);
console.log('Express app started on port 3000');
+9 -1
Ver Arquivo
@@ -1,6 +1,6 @@
body {
padding: 30px 50px;
font: 12px/1.4 "Lucida Grande", "Helvetica Nueue", Arial, sans-serif;
font: 12px/1.4 "Helvetica Neue", Arial, sans-serif;
}
a {
color: #00AAFF;
@@ -9,3 +9,11 @@ a {
a:hover {
text-decoration: underline;
}
.user {
margin: 0 10px;
float: left;
width: 25%;
}
table td:nth-child(2) {
padding: 0 5px;
}
+8 -5
Ver Arquivo
@@ -1,5 +1,8 @@
h1= name
p.summary
| <a href="http://github.com/#{name}">#{name}</a> has <strong>#{repos.length}</strong> repositories
| with a total of <strong>#{totalWatchers}</strong> watchers.
table#repos!= partial('repo', repos)
- each user in users
.user
h2= user.name
p.summary
| <a href="http://github.com/#{user.name}">#{user.name}</a> has
| <strong>#{user.repos.length}</strong> repositories
| with a total of <strong>#{user.totalWatchers}</strong> watchers.
table#repos!= partial('repo', user.repos)
+12 -15
Ver Arquivo
@@ -1,10 +1,12 @@
// Expose modules in ./support for demo purposes
require.paths.unshift(__dirname + '/../../support');
/**
* Module dependencies.
*/
var express = require('./../../lib/express'),
connect = require('connect');
var express = require('./../../lib/express');
// Path to our public directory
@@ -14,23 +16,17 @@ var pub = __dirname + '/public';
// and then serve with connect's staticProvider
var app = express.createServer(
connect.compiler({ src: pub, enable: ['sass'] }),
connect.staticProvider(pub)
express.compiler({ src: pub, enable: ['sass'] }),
express.staticProvider(pub)
);
// Optional since express defaults to CWD/views
app.set('views', __dirname + '/views');
// Enable auto-reloading of view contents when changed
// with an interval of 1000 milliseconds. Start the app
// with $ node examples/jade/app.js
// then alter some views :)
app.set('reload views', 1000);
// or app.enable('reload views'); for defaults
// Re-compile
// Set our default template engine to "jade"
// which prevents the need for extensions (although you can still mix and match)
app.set('view engine', 'jade');
// Dummy users
var users = [
@@ -40,11 +36,12 @@ var users = [
];
app.get('/', function(req, res){
res.render('users.jade', {
res.render('users', {
locals: {
users: users
}
});
});
app.listen(3000);
app.listen(3000);
console.log('Express app started on port 3000');
+13 -8
Ver Arquivo
@@ -1,28 +1,30 @@
// Expose modules in ./support for demo purposes
require.paths.unshift(__dirname + '/../../support');
/**
* Module dependencies.
*/
var express = require('./../../lib/express'),
form = require('./../../support/connect-form'),
connect = require('connect'),
var express = require('../../lib/express'),
form = require('connect-form'),
sys = require('sys');
var app = express.createServer(
// connect-form (http://github.com/visionmedia/connect-form)
// middleware uses the formidable middleware to parse urlencoded
// and multipart form data
form()
form({ keepExtensions: true })
);
app.get('/', function(req, res){
res.send('<form method="post" enctype="form-data/multipart">'
res.send('<form method="post" enctype="multipart/form-data">'
+ '<p>Image: <input type="file" name="image" /></p>'
+ '<p><input type="submit" value="Upload" /></p>'
+ '</form>');
});
app.post('/', function(req, res, params, next){
app.post('/', function(req, res, next){
// connect-form adds the req.form object
// we can (optionally) define onComplete, passing
@@ -31,7 +33,9 @@ app.post('/', function(req, res, params, next){
if (err) {
next(err);
} else {
sys.puts('\nuploaded ' + files.image.filename);
console.log('\nuploaded %s to %s',
files.image.filename,
files.image.path);
res.redirect('back');
}
});
@@ -44,4 +48,5 @@ app.post('/', function(req, res, params, next){
});
});
app.listen(3000);
app.listen(3000);
console.log('Express app started on port 3000');
+16
Ver Arquivo
@@ -0,0 +1,16 @@
// Expose modules in ./support for demo purposes
require.paths.unshift(__dirname + '/../../support');
/**
* Module dependencies.
*/
var express = require('../../lib/express');
var app = express.createServer();
require('./mvc').boot(app);
app.listen(3000);
console.log('Express app started on port 3000');
+9
Ver Arquivo
@@ -0,0 +1,9 @@
module.exports = {
// /
index: function(req, res){
res.render();
}
};
+55
Ver Arquivo
@@ -0,0 +1,55 @@
// Fake user database for example
var users = [
{ id: 0, name: 'TJ', email: 'tj@vision-media.ca' },
{ id: 1, name: 'Simon', email: 'simon@vision-media.ca' }
];
function get(id, fn) {
if (users[id]) {
fn(null, users[id]);
} else {
fn(new Error('User ' + id + ' does not exist'));
}
}
module.exports = {
// /users
index: function(req, res){
res.render(users);
},
// /users/:id
show: function(req, res, next){
get(req.params.id, function(err, user){
if (err) return next(err);
res.render(user);
});
},
// /users/:id/edit
edit: function(req, res, next){
get(req.params.id, function(err, user){
if (err) return next(err);
res.render(user);
});
},
// PUT /users/:id
update: function(req, res, next){
var id = req.params.id;
get(id, function(err){
if (err) return next(err);
var user = users[id] = req.body.user;
user.id = id;
req.flash('info', 'Successfully updated _' + user.name + '_.');
res.redirect('back');
});
}
};
+151
Ver Arquivo
@@ -0,0 +1,151 @@
/**
* Module dependencies.
*/
var fs = require('fs'),
express = require('../../lib/express');
exports.boot = function(app){
bootApplication(app);
bootControllers(app);
};
// App settings and middleware
function bootApplication(app) {
app.use(express.logger({ format: ':method :url :status' }));
app.use(express.bodyDecoder());
app.use(express.methodOverride());
app.use(express.cookieDecoder());
app.use(express.session());
app.use(app.router);
app.use(express.staticProvider(__dirname + '/public'));
// Example 500 page
app.error(function(err, req, res){
console.dir(err)
res.render('500');
});
// Example 404 page via simple Connect middleware
app.use(function(req, res){
res.render('404');
});
// Setup ejs views as default, with .html as the extension
app.set('views', __dirname + '/views');
app.register('.html', require('ejs'));
app.set('view engine', 'html');
// Some dynamic view helpers
app.dynamicHelpers({
request: function(req){
return req;
},
hasMessages: function(req){
return Object.keys(req.session.flash || {}).length;
},
messages: function(req){
return function(){
var msgs = req.flash();
return Object.keys(msgs).reduce(function(arr, type){
return arr.concat(msgs[type]);
}, []);
}
}
});
}
// Bootstrap controllers
function bootControllers(app) {
fs.readdir(__dirname + '/controllers', function(err, files){
if (err) throw err;
files.forEach(function(file){
bootController(app, file);
});
});
}
// Example (simplistic) controller support
function bootController(app, file) {
var name = file.replace('.js', ''),
actions = require('./controllers/' + name),
plural = name + 's', // realistically we would use an inflection lib
prefix = '/' + plural;
// Special case for "app"
if (name == 'app') {
prefix = '/';
}
Object.keys(actions).map(function(action){
var fn = controllerAction(name, plural, action, actions[action]);
switch(action) {
case 'index':
app.get(prefix, fn);
break;
case 'show':
app.get(prefix + '/:id.:format?', fn);
break;
case 'add':
app.get(prefix + '/:id/add', fn);
break;
case 'create':
app.post(prefix + '/:id', fn);
break;
case 'edit':
app.get(prefix + '/:id/edit', fn);
break;
case 'update':
app.put(prefix + '/:id', fn);
break;
case 'destroy':
app.del(prefix + '/:id', fn);
break;
}
});
}
// Proxy res.render() to add some magic
function controllerAction(name, plural, action, fn) {
return function(req, res, next){
var render = res.render,
format = req.params.format,
path = __dirname + '/views/' + name + '/' + action + '.html';
res.render = function(obj, options, fn){
res.render = render;
// Template path
if (typeof obj === 'string') {
return res.render(obj, options, fn);
}
// Format support
if (action == 'show' && format) {
if (format === 'json') {
return res.send(obj);
} else {
throw new Error('unsupported format "' + format + '"');
}
}
// Render template
res.render = render;
options = options || {};
options.locals = options.locals || {};
// Expose obj as the "users" or "user" local
if (action == 'index') {
options.locals[plural] = obj;
} else {
options.locals[name] = obj;
}
return res.render(path, options, fn);
};
fn.apply(this, arguments);
};
}
+24
Ver Arquivo
@@ -0,0 +1,24 @@
body {
padding: 30px;
font: 12px/1.4 "Helvetica Nueue", "Lucida Grande", Arial, sans-serif;
}
a {
color: #00aaff;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
#messages {
width: 95%;
margin-bottom: 15px;
padding: 10px;
border: 1px solid #00DD00;
-webkit-box-shadow: 1px 1px 4px rgba(0,0,0,0.2);
}
#messages li {
list-style: none;
}
#messages em {
font-weight: bold;
}
+2
Ver Arquivo
@@ -0,0 +1,2 @@
<h1>Cannot find <%= request.url %></h1>
<p>Sorry we failed to locate this page or resource.</p>
+2
Ver Arquivo
@@ -0,0 +1,2 @@
<h1>Internal Server Error</h1>
<p>Sorry an error has occurred, please try refreshing the page or navigate back to <a href="/">home</a>.</p>
+10
Ver Arquivo
@@ -0,0 +1,10 @@
<h1>Application Index</h1>
<p>Try visiting one of the following urls:</p>
<ul>
<li><a href="/users">/users</a></li>
<li><a href="/users/1">/users/1</a></li>
<li><a href="/users/1.json">/users/1.json</a></li>
<li><a href="/users/1/edit">/users/1/edit</a></li>
<li><a href="/accounts">/accounts (404, non existent)</a></li>
<li><a href="/users/1.foo">/users/1.foo (500, unsupported format)</a></li>
</ul>
+9
Ver Arquivo
@@ -0,0 +1,9 @@
<html>
<head>
<title>Express - MVC Example</title>
<link rel="stylesheet" href="/style.css" />
</head>
<body>
<%- body %>
</body>
</html>
+7
Ver Arquivo
@@ -0,0 +1,7 @@
<% if (hasMessages) { %>
<ul id="messages">
<% messages().forEach(function(msg){ %>
<li><%- msg %></li>
<% }) %>
</ul>
<% } %>
+8
Ver Arquivo
@@ -0,0 +1,8 @@
<h1>Editing user <%= user.name %></h1>
<%- partial('messages') %>
<form method="post" action="/users/<%= user.id %>">
<input type="hidden" name="_method" value="put" />
<p>Name: <input type="text" name="user[name]", value="<%= user.name %>" /></p>
<p>Email: <input type="text" name="user[email]", value="<%= user.email %>" /></p>
<p><input type="submit" value="Update" /></p>
</form>
+7
Ver Arquivo
@@ -0,0 +1,7 @@
<h1>Users</h1>
<%- partial('messages') %>
<ul>
<% users.forEach(function(user){ %>
<li><a href="/users/<%= user.id %>"><%= user.name %></a></li>
<% }) %>
</ul>
+7
Ver Arquivo
@@ -0,0 +1,7 @@
<h1>Viewing user #<%= user.id %></h1>
<%- partial('messages') %>
<ul>
<li><%- user.name %></li>
<li><%- user.email %></li>
<li><a href="<%= user.id %>/edit">Edit</a> this user</li>
</ul>
-58
Ver Arquivo
@@ -1,58 +0,0 @@
/**
* Module dependencies.
*/
var express = require('./../../lib/express');
var app = express.createServer(),
sys = require('sys');
app.set('views', __dirname + '/views');
// Provide our app with the notion of NotFound exceptions
function NotFound(msg){
this.name = 'NotFound';
Error.call(this, msg);
Error.captureStackTrace(this, arguments.callee);
}
sys.inherits(NotFound, Error);
app.get('/', function(req, res){
res.render('index.jade');
});
app.get('/404', function(req, res){
throw new NotFound;
});
app.get('/500', function(req, res){
throw new Error('keyboard cat!');
});
// We can call app.error() several times as shown below.
// Here we check for an instanceof NotFound and show the
// 404 page, or we pass on to the next error handler.
app.error(function(err, req, res, next){
if (err instanceof NotFound) {
res.render('404.jade');
} else {
next(err);
}
});
// Here we assume all errors as 500 for the simplicity of
// this demo, however you can choose whatever you like
app.error(function(err, req, res){
res.render('500.jade', {
locals: {
error: err
}
});
});
app.listen(3000);
-1
Ver Arquivo
@@ -1 +0,0 @@
h2 Page Not Found
+75
Ver Arquivo
@@ -0,0 +1,75 @@
/**
* Module dependencies.
*/
var express = require('../../lib/express');
var app = express.createServer();
// Ad-hoc example resource method
app.resource = function(path, obj) {
this.get(path, obj.index);
this.get(path + '/:a..:b', function(req, res){
var a = parseInt(req.params.a, 10),
b = parseInt(req.params.b, 10);
obj.range(req, res, a, b);
});
this.get(path + '/:id', obj.show);
this.del(path + '/:id', obj.destroy);
};
// Fake records
var users = [
{ name: 'tj' },
{ name: 'ciaran' },
{ name: 'aaron' },
{ name: 'guillermo' },
{ name: 'simon' },
{ name: 'tobi' }
];
// Fake controller
var User = {
index: function(req, res){
res.send(users);
},
show: function(req, res){
res.send(users[req.params.id] || { error: 'Cannot find user' });
},
destroy: function(req, res){
var id = req.params.id;
var destroyed = id in users;
delete users[id];
res.send(destroyed ? 'destroyed' : 'Cannot find user');
},
range: function(req, res, a, b){
res.send(users.slice(a, b+1));
}
};
// curl http://localhost:3000/users -- responds with all users
// curl http://localhost:3000/users/1 -- responds with user 1
// curl http://localhost:3000/users/4 -- responds with error
// curl http://localhost:3000/users/1..3 -- responds with several users
// curl -X DELETE http://localhost:3000/users/1 -- deletes the user
app.resource('/users', User);
app.get('/', function(req, res){
res.send([
'<h1>Examples:</h1> <ul>',
'<li>GET /users</li>',
'<li>GET /users/1</li>',
'<li>GET /users/3</li>',
'<li>GET /users/1..3</li>',
'<li>DELETE /users/4</li>',
'</ul>',
].join('\n'));
});
app.listen(3000);
console.log('Express app started on port 3000');
+86
Ver Arquivo
@@ -0,0 +1,86 @@
/**
* Module dependencies.
*/
var express = require('../../lib/express');
var app = express.createServer();
// Example requests:
// curl http://localhost:3000/user/0
// curl http://localhost:3000/user/0/edit
// curl http://localhost:3000/user/1
// curl http://localhost:3000/user/1/edit (unauthorized since this is not you)
// curl -X DELETE http://localhost:3000/user/0 (unauthorized since you are not an admin)
// Dummy users
var users = [
{ id: 0, name: 'tj', email: 'tj@vision-media.ca', role: 'member' },
{ id: 1, name: 'ciaran', email: 'ciaranj@gmail.com', role: 'member' },
{ id: 2, name: 'aaron', email: 'aaron.heckmann+github@gmail.com', role: 'admin' }
];
function loadUser(req, res, next) {
// You would fetch your user from the db
var user = users[req.params.id];
if (user) {
req.user = user;
next();
} else {
next(new Error('Failed to load user ' + req.params.id));
}
}
function andRestrictToSelf(req, res, next) {
// If our authenticated user is the user we are viewing
// then everything is fine :)
if (req.authenticatedUser.id == req.user.id) {
next();
} else {
// You may want to implement specific exceptions
// such as UnauthorizedError or similar so that you
// can handle these in app.error() specifically
// (view ./examples/pages for this)
next(new Error('Unauthorized'));
}
}
function andRestrictTo(role) {
return function(req, res, next) {
if (req.authenticatedUser.role == role) {
next();
} else {
next(new Error('Unauthorized'));
}
}
}
// Middleware for faux authentication
// you would of course implement something real,
// but this illustrates how an authenticated user
// may interacte with middleware
app.use(function(req, res, next){
req.authenticatedUser = users[0];
next();
});
app.get('/', function(req, res){
res.redirect('/user/0');
});
app.get('/user/:id', loadUser, function(req, res){
res.send('Viewing user ' + req.user.name);
});
app.get('/user/:id/edit', loadUser, andRestrictToSelf, function(req, res){
res.send('Editing user ' + req.user.name);
});
app.del('/user/:id', loadUser, andRestrictTo('admin'), function(req, res){
res.send('Deleted user ' + req.user.name);
});
app.listen(3000);
console.log('Express app started on port 3000');
+41
Ver Arquivo
@@ -0,0 +1,41 @@
// Expose modules in ./support for demo purposes
require.paths.unshift(__dirname + '/../../support');
/**
* Module dependencies.
*/
var express = require('../../lib/express')
, app = express.createServer()
, site = require('./site')
, post = require('./post')
, user = require('./user');
// Config
app.set('view engine', 'ejs');
app.set('views', __dirname + '/views');
app.use(express.bodyDecoder());
app.use(express.methodOverride());
app.use(express.staticProvider(__dirname + '/public'));
// General
app.get('/', site.index);
// User
app.all('/users', user.list);
app.all('/user/:id/:op?', user.load);
app.get('/user/:id', user.view);
app.get('/user/:id/view', user.view);
app.get('/user/:id/edit', user.edit);
app.put('/user/:id/edit', user.update);
// Posts
app.get('/posts', post.list);
app.listen(3000);
console.log('Express app started on port 3000');
+17
Ver Arquivo
@@ -0,0 +1,17 @@
// Fake posts database
var posts = [
{ title: 'Foo', body: 'some foo bar' }
, { title: 'Foo bar', body: 'more foo bar' }
, { title: 'Foo bar baz', body: 'more foo bar baz' }
];
exports.list = function(req, res){
res.render('post/list', {
locals: {
title: 'Posts'
, posts: posts
}
});
};
+24
Ver Arquivo
@@ -0,0 +1,24 @@
body {
padding: 50px;
font: 14px "Helvetica Neue", Arial, sans-serif;
}
a {
color: #00AEFF;
text-decoration: none;
}
a.edit {
color: #000;
opacity: .3;
}
a.edit::before {
content: '[ ';
}
a.edit::after {
content: ' ]';
}
dt {
font-weight: bold;
}
dd {
margin: 15px;
}
+8
Ver Arquivo
@@ -0,0 +1,8 @@
exports.index = function(req, res){
res.render('index', {
locals: {
title: 'Route Separation Example'
}
});
};
+53
Ver Arquivo
@@ -0,0 +1,53 @@
// Fake user database
var users = [
{ name: 'TJ', email: 'tj@vision-media.ca' }
, { name: 'Tobi', email: 'tobi@vision-media.ca' }
];
exports.list = function(req, res){
res.render('user/list', {
locals: {
title: 'Users'
, users: users
}
});
};
exports.load = function(req, res, next){
var id = req.params.id;
req.user = users[id];
if (req.user) {
next();
} else {
next(new Error('cannot find user ' + id));
}
};
exports.view = function(req, res){
res.render('user/view', {
locals: {
title: 'Viewing user ' + req.user.name
, user: req.user
}
});
};
exports.edit = function(req, res){
res.render('user/edit', {
locals: {
title: 'Editing user ' + req.user.name
, user: req.user
}
});
};
exports.update = function(req, res){
// Normally you would handle all kinds of
// validation and save back to the db
var user = req.body.user;
req.user.name = user.name;
req.user.email = user.email;
res.redirect('back');
};
+4
Ver Arquivo
@@ -0,0 +1,4 @@
<ul>
<li>Visit the <a href="/users">users</a> page</li>
<li>Visit the <a href="/posts">posts</a> page</li>
</ul>
+9
Ver Arquivo
@@ -0,0 +1,9 @@
<html>
<head>
<title><%= title %></title>
<link href="/style.css" rel="stylesheet" />
</head>
<body>
<%- body %>
</body>
</html>
@@ -0,0 +1,7 @@
<h1>Posts</h1>
<dl id="posts">
<% posts.forEach(function(post){ %>
<dt><%= post.title %></dt>
<dd><%= post.body %></dd>
<% }) %>
</dl>
@@ -0,0 +1,9 @@
<h1>Editing <%= user.name %></h1>
<div id="user">
<form method="post">
<input type="hidden" value="put" name="_method" />
<p>Name: <input type="text" value="<%= user.name %>" name="user[name]"/></p>
<p>Email: <input type="text" value="<%= user.email %>" name="user[email]"/></p>
<p><input type="submit" value="Save" /></p>
</form>
</div>
@@ -0,0 +1,9 @@
<h1>Users</h1>
<ul id="users">
<% users.forEach(function(user, id){ %>
<li>
<a href="/user/<%= id %>"><%= user.name %></a>
<a class="edit" href="/user/<%= id %>/edit">edit</a>
</li>
<% }) %>
</ul>
@@ -0,0 +1,4 @@
<h1><%= user.name %></h1>
<div id="user">
<p>Email: <%= user.email %></p>
</div>

Alguns arquivos não foram exibidos porque demasiados arquivos foram alterados neste diff Mostrar Mais