<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Nodejs</title>
        <link>http://blogs.ugidotnet.org:443/ainotame/category/Nodejs.aspx</link>
        <description>Nodejs</description>
        <language>it</language>
        <copyright>Roberto Sarati</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Webapi-like controllers in NodeJS+ExpressJS</title>
            <link>http://blogs.ugidotnet.org:443/ainotame/archive/2014/10/12/webapi-like-controllers-in-nodeexpress.aspx</link>
            <description>&lt;p&gt;Lavorando su un progetto ~MEAN (MongoDB + ExpressJS + AngularJS + nodeJS) mi sono chiesto: “perchè non creare un modulo di registrazione custom dei controller simile a quella delle webapi di asp.net”? da qui è nato il seguente modulo:&lt;/p&gt;  &lt;p /&gt; &lt;!-- HTML generated using hilite.me --&gt;  &lt;div style="overflow: auto; border-top: gray 0.1em solid; border-right: gray 0.1em solid; width: auto; background: #ffffff; border-bottom: gray 0.1em solid; padding-bottom: 0.2em; padding-top: 0.2em; padding-left: 0.6em; border-left: gray 0.8em solid; padding-right: 0.6em"&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;pre style="margin: 0px; line-height: 125%"&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29&lt;/pre&gt;
        &lt;/td&gt;

        &lt;td&gt;
          &lt;pre style="margin: 0px; line-height: 125%"&gt;&lt;span style="font-weight: bold; color: #008800"&gt;var&lt;/span&gt; path &lt;span style="color: #333333"&gt;=&lt;/span&gt; require(&lt;span style="background-color: #fff0f0"&gt;'path'&lt;/span&gt;);
&lt;span style="font-weight: bold; color: #008800"&gt;var&lt;/span&gt; fs &lt;span style="color: #333333"&gt;=&lt;/span&gt; require(&lt;span style="background-color: #fff0f0"&gt;'fs'&lt;/span&gt;);
&lt;span style="font-weight: bold; color: #008800"&gt;var&lt;/span&gt; config &lt;span style="color: #333333"&gt;=&lt;/span&gt; require(&lt;span style="background-color: #fff0f0"&gt;'./config'&lt;/span&gt;);
&lt;span style="font-weight: bold; color: #008800"&gt;var&lt;/span&gt; _ &lt;span style="color: #333333"&gt;=&lt;/span&gt; require(&lt;span style="background-color: #fff0f0"&gt;'lodash'&lt;/span&gt;);

&lt;span style="font-weight: bold; color: #008800"&gt;var&lt;/span&gt; getControllersInServerFolder &lt;span style="color: #333333"&gt;=&lt;/span&gt; &lt;span style="font-weight: bold; color: #008800"&gt;function&lt;/span&gt; (serverFolder) {
    &lt;span style="font-weight: bold; color: #008800"&gt;if&lt;/span&gt; (_.isEmpty(serverFolder)) {
        serverFolder &lt;span style="color: #333333"&gt;=&lt;/span&gt; config.settings.controllersFolder;
    }

    &lt;span style="font-weight: bold; color: #008800"&gt;var&lt;/span&gt; controllers &lt;span style="color: #333333"&gt;=&lt;/span&gt; [];

    &lt;span style="font-weight: bold; color: #008800"&gt;var&lt;/span&gt; fileSystemObjects &lt;span style="color: #333333"&gt;=&lt;/span&gt; fs.readdirSync(serverFolder); &lt;span style="color: #888888"&gt;//read folder content&lt;/span&gt;
    &lt;span style="font-weight: bold; color: #008800"&gt;if&lt;/span&gt; (_.isArray(fileSystemObjects)) {
        _.forEach(fileSystemObjects, &lt;span style="font-weight: bold; color: #008800"&gt;function&lt;/span&gt; (fso) {
            &lt;span style="font-weight: bold; color: #008800"&gt;var&lt;/span&gt; fsoFullPath &lt;span style="color: #333333"&gt;=&lt;/span&gt; path.join(serverFolder, fso);
            &lt;span style="font-weight: bold; color: #008800"&gt;var&lt;/span&gt; fsoStat &lt;span style="color: #333333"&gt;=&lt;/span&gt; fs.statSync(fsoFullPath);
            &lt;span style="font-weight: bold; color: #008800"&gt;if&lt;/span&gt; (fsoStat.isFile() &lt;span style="color: #333333"&gt;&amp;amp;&amp;amp;&lt;/span&gt; fso.endsWith(&lt;span style="background-color: #fff0f0"&gt;'controller.js'&lt;/span&gt;)) {
                controllers.push(require(path.relative(__dirname, fsoFullPath)));
            } &lt;span style="font-weight: bold; color: #008800"&gt;else&lt;/span&gt; &lt;span style="font-weight: bold; color: #008800"&gt;if&lt;/span&gt; (fsoStat.isDirectory()) {
                _.union(controllers, getControllersInServerFolder(fsoFullPath));
            }
        });
    }

    &lt;span style="font-weight: bold; color: #008800"&gt;return&lt;/span&gt; controllers;
};

exports.getControllers &lt;span style="color: #333333"&gt;=&lt;/span&gt; getControllersInServerFolder;&lt;/pre&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p /&gt;

&lt;p&gt;Quindi nello startup del server nodejs:&lt;/p&gt;
&lt;!-- HTML generated using hilite.me --&gt;

&lt;div style="overflow: auto; border-top: gray 0.1em solid; border-right: gray 0.1em solid; width: auto; background: #ffffff; border-bottom: gray 0.1em solid; padding-bottom: 0.2em; padding-top: 0.2em; padding-left: 0.6em; border-left: gray 0.8em solid; padding-right: 0.6em"&gt;
  &lt;table&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;
          &lt;pre style="margin: 0px; line-height: 125%"&gt;1
2
3&lt;/pre&gt;
        &lt;/td&gt;

        &lt;td&gt;
          &lt;pre style="margin: 0px; line-height: 125%"&gt;_.forEach(require(&lt;span style="background-color: #fff0f0"&gt;'controllers-manager'&lt;/span&gt;)..getControllers(), &lt;span style="font-weight: bold; color: #008800"&gt;function&lt;/span&gt;(controller) {
	server.use(controller.path, controller.router); &lt;span style="color: #888888"&gt;// register route into expressjs&lt;/span&gt;
});&lt;/pre&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;Ora i controller sono tutti quei files definiti nella cartella config.settings.controllersFolder (o sottocartelle) che terminano con ‘controller.js’ e hanno tutti la seguente struttura:&lt;/p&gt;

&lt;!-- HTML generated using hilite.me --&gt;&lt;div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre style="margin: 0; line-height: 125%"&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre style="margin: 0; line-height: 125%"&gt;&lt;span style="color: #008800; font-weight: bold"&gt;var&lt;/span&gt; express &lt;span style="color: #333333"&gt;=&lt;/span&gt; require(&lt;span style="background-color: #fff0f0"&gt;'express'&lt;/span&gt;);
&lt;span style="color: #008800; font-weight: bold"&gt;var&lt;/span&gt; router &lt;span style="color: #333333"&gt;=&lt;/span&gt; express.Router();

&lt;span style="color: #888888"&gt;//apply before any actions (check authorizations...)&lt;/span&gt;
router.use(&lt;span style="color: #008800; font-weight: bold"&gt;function&lt;/span&gt;(req, res, next) {
	next(); &lt;span style="color: #888888"&gt;//go to next &lt;/span&gt;
});

router.get(&lt;span style="background-color: #fff0f0"&gt;'/message'&lt;/span&gt;, &lt;span style="color: #008800; font-weight: bold"&gt;function&lt;/span&gt;(req, res, next) {
	res.send({&lt;span style="background-color: #fff0f0"&gt;'Hello world'&lt;/span&gt;});
});

exports.path &lt;span style="color: #333333"&gt;=&lt;/span&gt; &lt;span style="background-color: #fff0f0"&gt;'/api/sample'&lt;/span&gt;;
exports.router &lt;span style="color: #333333"&gt;=&lt;/span&gt; router;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;


&lt;p&gt;Facile, semplice e veloce.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org:443/ainotame/aggbug/101888.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Roberto Sarati</dc:creator>
            <guid>http://blogs.ugidotnet.org:443/ainotame/archive/2014/10/12/webapi-like-controllers-in-nodeexpress.aspx</guid>
            <pubDate>Sun, 12 Oct 2014 16:49:31 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org:443/ainotame/archive/2014/10/12/webapi-like-controllers-in-nodeexpress.aspx#feedback</comments>
            <slash:comments>6</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org:443/ainotame/comments/commentRss/101888.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org:443/ainotame/services/trackbacks/101888.aspx</trackback:ping>
        </item>
    </channel>
</rss>