<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.8" -->
<?xml-stylesheet href="https://www.wiki.leomartin.net/lib/exe/css.php?s=feed" type="text/css"?>
<rdf:RDF
    xmlns="http://purl.org/rss/1.0/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel rdf:about="https://www.wiki.leomartin.net/feed.php">
        <title>DokuWiki njsetn</title>
        <description></description>
        <link>https://www.wiki.leomartin.net/</link>
        <image rdf:resource="https://www.wiki.leomartin.net/lib/tpl/dokuwiki/images/favicon.ico" />
       <dc:date>2026-04-08T01:51:22+00:00</dc:date>
        <items>
            <rdf:Seq>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:advanced_testing_sinon_spies&amp;rev=1459170840&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:advanced_testing_sinon_stubs&amp;rev=1459171720&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:argument_variables_with_process.argv&amp;rev=1458491426&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:asynchronous_mocha_testing&amp;rev=1459165837&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:automation_with_npm&amp;rev=1459202185&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:broadcasting_messages_with_websockets&amp;rev=1459160955&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:building_a_web_server&amp;rev=1458933976&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:bundling_client_scripts_with_browserify&amp;rev=1459199965&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:checking_server_responses_with_cheerio&amp;rev=1459180209&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:code_coverage_with_istanbul&amp;rev=1459172303&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:collecting_information_with_readline&amp;rev=1458590806&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:collecting_post_data&amp;rev=1458936981&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:converting_less_to_css_with_grunt&amp;rev=1459199810&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:core_modules&amp;rev=1458501409&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:creating_a_websocket_server&amp;rev=1459159627&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:creating_child_process_with_exec&amp;rev=1458593494&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:creating_child_process_with_spawn&amp;rev=1458763792&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:creating_websockets_with_socket.io&amp;rev=1459162273&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:debugging_with_npm&amp;rev=1459202814&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:directory_creation&amp;rev=1458767136&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:exporting_custom_modules&amp;rev=1458592527&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:express_post_bodies_and_params&amp;rev=1459102883&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:express_routing_and_cors&amp;rev=1459102725&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:file_servers_with_httpster&amp;rev=1458943101&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:global_timing_functions&amp;rev=1458499849&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:handling_events_with_eventemitter&amp;rev=1458590913&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:hinting_your_code_with_grunt&amp;rev=1459199765&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:how_node.js_works&amp;rev=1458485838&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:injecting_dependencies_with_rewire&amp;rev=1459170590&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:installing_dependencies&amp;rev=1458482566&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:installing_node.js_on_a_mac&amp;rev=1462642500&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:installing_npms_globally_on_a_mac&amp;rev=1462708653&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:installing_npms_locally&amp;rev=1458937393&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:intro_to_express&amp;rev=1459102535&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:listing_directory_files&amp;rev=1458764381&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:making_a_request&amp;rev=1479922606&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:mocking_a_server_with_nock&amp;rev=1459167402&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:next_steps&amp;rev=1459203015&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:node.js_history&amp;rev=1458485602&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:rapid_development_with_grunt_watches&amp;rev=1459201706&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:readable_file_streams&amp;rev=1458807161&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:reading_files&amp;rev=1458765420&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:renaming_and_removing_directories&amp;rev=1458769958&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:renaming_and_removing_files&amp;rev=1458769125&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:serving_files&amp;rev=1458934389&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:serving_json_data&amp;rev=1458935774&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:standard_input_and_standard_output&amp;rev=1458496620&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:testing_http_endpoints_with_supertest&amp;rev=1459177401&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:testing_with_mocha_and_chai&amp;rev=1462356898&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:the_global_object&amp;rev=1458488469&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:the_package.json_file&amp;rev=1459102064&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:welcome&amp;rev=1458482350&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:what_you_should_know&amp;rev=1458482444&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:writable_file_streams&amp;rev=1458807772&amp;do=diff"/>
                <rdf:li rdf:resource="https://www.wiki.leomartin.net/doku.php?id=njsetn:writing_and_appending_files&amp;rev=1458766656&amp;do=diff"/>
            </rdf:Seq>
        </items>
    </channel>
    <image rdf:about="https://www.wiki.leomartin.net/lib/tpl/dokuwiki/images/favicon.ico">
        <title>DokuWiki</title>
        <link>https://www.wiki.leomartin.net/</link>
        <url>https://www.wiki.leomartin.net/lib/tpl/dokuwiki/images/favicon.ico</url>
    </image>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:advanced_testing_sinon_spies&amp;rev=1459170840&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-28T15:14:00+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:advanced_testing_sinon_spies</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:advanced_testing_sinon_spies&amp;rev=1459170840&amp;do=diff</link>
        <description>&lt;- Injecting dependencies with rewireAdvanced testing Sinon stubs -&gt;
-&gt; sinonjs.org

spies

Les spies sont des fonctions particulières qui enregistrent différents détails sur comment elles sont appelées, avec quels arguments, et l'état de l'objet this qui est associé à chaque fonction.

On peut utiliser des</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:advanced_testing_sinon_stubs&amp;rev=1459171720&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-28T15:28:40+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:advanced_testing_sinon_stubs</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:advanced_testing_sinon_stubs&amp;rev=1459171720&amp;do=diff</link>
        <description>&lt;- Advanced testing Sinon spiesCode coverage with Istanbul -&gt;
Stubs -&gt; = spies++, en gros permet de contrôler le comportement d'une fonction en particulier.


// order-spec.js

(...)

this.console = (...);

this.warehouse = {
  packageAndShip: sinon.stub().yelds(0123456789) // la fonction yelds va invoquer le callback refilé lors de l'appelle de packageAndShip //0123456789 = faux tracking number attendu
}


order.__set__(&quot;inventoryData&quot;, this.testData);
order.__set__(&quot;console&quot;, this.console);
or…</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:argument_variables_with_process.argv&amp;rev=1458491426&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-20T17:30:26+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:argument_variables_with_process.argv</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:argument_variables_with_process.argv&amp;rev=1458491426&amp;do=diff</link>
        <description>&lt;- The global objectStandard input and standard output -&gt;
l'objet global process

Permet d'obtenir des informations sur l'nevironnement, ses variables, communiquer avec le terminal, les processes, standard i/o, et quitter le processus courant - process.exit() -.

Permet par exemple de collecter des arguments depuis le terminal au démarrage de l'application. Elle seront stockées dans process.argv (ARGument Variables).</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:asynchronous_mocha_testing&amp;rev=1459165837&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-28T13:50:37+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:asynchronous_mocha_testing</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:asynchronous_mocha_testing&amp;rev=1459165837&amp;do=diff</link>
        <description>&lt;- Testing with mocha and ChaiMocking a server with Nock -&gt;
Pour tester par exemple une web request, le dispositif de test va devoir attendre que la requête soit complétée.


// tools-spec.js
describe(“Tools()”, function() {
  describe(“printName()”, function() {
    it(&quot;should print the last name first&quot;, function() {
      var results = tools.printName({ first: &quot;Alex&quot;, last: &quot;banks&quot;});
      expect(results).to.equal(&quot;Banks, Alex&quot;);
    });
  });
  describe(&quot;loadWiki()&quot;, function() {
    this.ti…</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:automation_with_npm&amp;rev=1459202185&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-28T23:56:25+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:automation_with_npm</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:automation_with_npm&amp;rev=1459202185&amp;do=diff</link>
        <description>&lt;- Rapid development with Grunt WatchesDebugging with npm -&gt;

// package.json
{
  &quot;name&quot;:(...),
  &quot;scripts&quot;: {
    &quot;prestart&quot;: &quot;grunt&quot;, // sera lancé avant le start
    &quot;start&quot;: &quot;node app&quot;,
    &quot;predev&quot;: &quot;grunt&quot;,
    &quot;dev&quot;: &quot;open http://localhost:300 &amp; node-dev app &amp; grunt watch&quot;, // les commandes séparées par &amp; sont lancées de manière simultanées
  },</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:broadcasting_messages_with_websockets&amp;rev=1459160955&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-28T12:29:15+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:broadcasting_messages_with_websockets</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:broadcasting_messages_with_websockets&amp;rev=1459160955&amp;do=diff</link>
        <description>&lt;- Creating a WebSocket serverCreating WebSockets with Socket.IO -&gt;

// client.js
document.forms[0].onsubmit = function() {
  var input = document.getElementById('message');
  ws.send(input.value);
  input.value = ''; 



// server
 (..)
  wss.on(&quot;connection&quot;, function(ws) {
    ws.on(&quot;message&quot;, function(message) {
      if (message === 'exit') {
        ws.close();
      } else {
        ws.clients.forEach(function(client) {
          client.send(message);
        });
      }
    });
    ws.sen…</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:building_a_web_server&amp;rev=1458933976&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-25T20:26:16+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:building_a_web_server</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:building_a_web_server&amp;rev=1458933976&amp;do=diff</link>
        <description>&lt;- Making a requestServing files -&gt;
-&gt; nodejs.org/api/http.html

-&gt; nodejs.org/api/https.html


var require(&quot;http&quot;);

var server = http.createServer(function(req, res) {
  res.writeHead(200, {&quot;Content-Type&quot;: &quot;text/plain&quot;});
  // 200 : successful // text/html for html
  res.end(&quot;Hello World&quot;);
});

server.listen(3000); // port 3000

console.log(&quot;Server listening on port 3000&quot;);</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:bundling_client_scripts_with_browserify&amp;rev=1459199965&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-28T23:19:25+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:bundling_client_scripts_with_browserify</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:bundling_client_scripts_with_browserify&amp;rev=1459199965&amp;do=diff</link>
        <description>&lt;- Converting LESS to CSS with GruntRapid development with Grunt Watches -&gt;
-&gt; bundle toutes les libs js utilisées en unbundling client script with browserify

-&gt; bundle toutes les libs js utilisées en un seul fichier js

npm install grunt-browserify --save-dev


// printTerms.js
var $ = require(&quot;jquery&quot;);
var printTerms = require(&quot;./lib/printTerms&quot;);</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:checking_server_responses_with_cheerio&amp;rev=1459180209&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-28T17:50:09+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:checking_server_responses_with_cheerio</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:checking_server_responses_with_cheerio&amp;rev=1459180209&amp;do=diff</link>
        <description>&lt;- Testing HTTP endpoints with SupertestHinting your code with Grunt -&gt;
-&gt; Check the data that get returned


// app-spec.js
(...)
var cheerio = require(&quot;cheerio&quot;);
(...)

it(&quot;Loads the home page&quot;, function(done) {
  request(app).get(&quot;/&quot;).expect(200).end(function(err, res) {
    var $ = cheerio.load(res.text);
    var pageHeading = $(&quot;body&gt;h1:first-child&quot;).text();
    expect(pageHeading).to.equal(&quot;Skier Dictionary&quot;);
  });
});

(...)

it(&quot;GETS dictionary-api&quot;, function(done) {
  var defs =  this…</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:code_coverage_with_istanbul&amp;rev=1459172303&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-28T15:38:23+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:code_coverage_with_istanbul</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:code_coverage_with_istanbul&amp;rev=1459172303&amp;do=diff</link>
        <description>&lt;- Advanced testing Sinon stubsTesting HTTP endpoints with Supertest -&gt;
Un code cover reports nous indique quelle quantité du code total nos tests couvrent.

-&gt; sudo npm install -g istanbul

Istanbul paut fonctionner avec mocha

istanbul cover _mocha

Le rapport est visualisable en html dans coverage/Icov-report/index.html et permet de voir fichier par fichier le coverage du code.
, et ce qui n'est pas couvert !</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:collecting_information_with_readline&amp;rev=1458590806&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-21T21:06:46+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:collecting_information_with_readline</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:collecting_information_with_readline&amp;rev=1458590806&amp;do=diff</link>
        <description>&lt;- Core modulesHandling events with EventEmitter -&gt;
-&gt; nodejs.org/api/readline.html

readline est un module “wrap” autour du standard input qui permet de prompter facilement un utilisateur et de récupérer des données.


var readline = require('readline');
var interface = readline = readline.createInterface(process.stdin, process.stdout);
var unladen_swallow = {
  specy: 'european',
  airspeed_velocity: 0
};
interface.question(&quot;What...is the airspeed velocity of an unladen swallow?\n&quot;, function(s…</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:collecting_post_data&amp;rev=1458936981&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-25T21:16:21+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:collecting_post_data</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:collecting_post_data&amp;rev=1458936981&amp;do=diff</link>
        <description>&lt;- Serving JSON dataInstalling npms locally -&gt;

var http = require(&quot;http&quot;);
var fs = require(&quot;fs&quot;);

http.createServer(function(req, res) {

  if (req.method === &quot;GET&quot;) {
  res.writeHead(200, {&quot;Content-Type&quot;: &quot;text/html&quot;});

  fs.createReadStream(&quot;./pubic/form.html&quot;, &quot;UTF-8&quot;).pipe(res);
  } else if (req.method === 'POST') {
    var body = &quot;&quot;;

    req.on(&quot;data&quot;, function(chunk) {
      body += chunk;
    });

    req.on(&quot;end&quot;, function() {

      res.writeHead(200, {&quot;Content-Type&quot;: &quot;text/html&quot;})…</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:converting_less_to_css_with_grunt&amp;rev=1459199810&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-28T23:16:50+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:converting_less_to_css_with_grunt</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:converting_less_to_css_with_grunt&amp;rev=1459199810&amp;do=diff</link>
        <description>&lt;- Hinting your code with GruntBundling client scripts with Browserify -&gt;
Préprocesser du LESS

npm install grunt-contrib-less --save-dev

Automatiser les préfixes

npm install grunt-autoprefixer --save-dev


// GruntFile.js

module.export = function(grunt) {
  grunt.initConfig({
    jshint: {
      (...)
    },
    less: {
      production: {
        files {
          &quot;public/css/style.css&quot;: [&quot;less/*.less&quot;]
        },
      },
    },
    autoprefixer: {
      single_file: {
        src: &quot;public…</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:core_modules&amp;rev=1458501409&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-20T20:16:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:core_modules</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:core_modules&amp;rev=1458501409&amp;do=diff</link>
        <description>&lt;- Global timing functionsCollecting information with Readline -&gt;
fonction require

La fonction require est ce que l'on utilise pour charger des modules. Beaucoup des modules que l'on utilise sont hébergés sur le registre NPM et doivent être installés avant d'être utilisés.

(Ces premiers chapitres s'intéressent uniquement aux modules installés par défaut avec nodeJS, comme le module path).</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:creating_a_websocket_server&amp;rev=1459159627&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-28T12:07:07+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:creating_a_websocket_server</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:creating_a_websocket_server&amp;rev=1459159627&amp;do=diff</link>
        <description>&lt;- Express post bodies and paramsBroadcasting messages with WebSockets -&gt;
-&gt; developer.mozilla.org/en-US/docs/Web/API/WebSockets_API

Connection interactive, et dans les deux sens entre client et serveur.

Jusqu'ici impossible pour le serveur d'envoyer des infos vers le client, il fallait toujours que le client check le serveur pour cela.</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:creating_child_process_with_exec&amp;rev=1458593494&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-21T21:51:34+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:creating_child_process_with_exec</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:creating_child_process_with_exec&amp;rev=1458593494&amp;do=diff</link>
        <description>&lt;- Exporting custom modulesCreating child process with spawn -&gt;
Child Object qui permet d'exécuter des “child process” dans notre environment. -&gt; On peut communiquer avec d'autres applications sur l'hôte. Deux principales fonctions pour cela :

	*  spawn
	*  exec


&gt;&gt; open . // ouvre le finder sur le repértoire actuelle
&gt;&gt; explore . // là même sous MS-Windows
&gt;&gt; open http://url.tld // là même sur les deux systèmes
&gt;&gt; git version // obtenir la version de git
// toutes ces &quot;commandes externes&quot; peu…</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:creating_child_process_with_spawn&amp;rev=1458763792&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-23T21:09:52+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:creating_child_process_with_spawn</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:creating_child_process_with_spawn&amp;rev=1458763792&amp;do=diff</link>
        <description>&lt;- Creating child process with execListing directory files -&gt;
spawn -&gt; plus pour de l'asynchrone

/alwaysGTalking.js
/spawn.js


//alwaysTalking.js

var phrases = [
  'phase 1',
  'phase 2',
  'phase 3'
];

var interval = setInterval(function(){
  var i = Math.floor(Math.random() * phrases.length);
  process.stdout.write(`${phrases[i]} \n`);
}, 1000);

process.stdin.on('data', function(data) {
  console.log(`STDIN Data Received -&gt; ${data.toString().trim()}`);
  clearInterval(interval);
  process…</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:creating_websockets_with_socket.io&amp;rev=1459162273&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-28T12:51:13+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:creating_websockets_with_socket.io</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:creating_websockets_with_socket.io&amp;rev=1459162273&amp;do=diff</link>
        <description>&lt;- Broadcasting messages with WebSocketsTesting with mocha and Chai -&gt;
Le support pour les websockets est bon, mais pas dans les vieux navigateurs comme &lt; IE10. -&gt; canisuse.com/#search=websockets

-&gt; socket.io : module avec son propre serveur et client -&gt; fallback de websockets vers long polling quand websockets non supportées.</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:debugging_with_npm&amp;rev=1459202814&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-29T00:06:54+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:debugging_with_npm</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:debugging_with_npm&amp;rev=1459202814&amp;do=diff</link>
        <description>&lt;- Automation with npmNext steps -&gt;
-&gt;  npmjs.com/package/node-inspector

sudo npm install -g node-inspector


// package.json
{
(...)
  &quot;scripts&quot;: {
    &quot;predebug&quot;: &quot;grunt&quot;,
    &quot;debug&quot;: &quot;open http://localhost:3000 &amp; open http://localhost:8080/debug?port=5858&quot;,
    &quot;postdebug&quot;: &quot;node-inspector &amp; node --debug app&quot;, // on lance le debugger de node + l'app en mode debug (connectée au debugger).</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:directory_creation&amp;rev=1458767136&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-23T22:05:36+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:directory_creation</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:directory_creation&amp;rev=1458767136&amp;do=diff</link>
        <description>&lt;- Writing and appending filesRenaming and removing files -&gt;

var fs = require(&quot;fs&quot;);

if ( fs.existsSync(&quot;lib&quot;) ){
  console.log(&quot;Directory already there&quot;);
} else {
  fs.mkdir(&quot;lib&quot;, function(error) {
    if (error) { console.log(error); }
    else { console.log(&quot;directory Created&quot;); }
  }
}</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:exporting_custom_modules&amp;rev=1458592527&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-21T21:35:27+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:exporting_custom_modules</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:exporting_custom_modules&amp;rev=1458592527&amp;do=diff</link>
        <description>&lt;- Handling events with EventEmitterCreating child process with exec -&gt;
-&gt; nodejs.org/api/modules.html

La fonction require est partie du “common js pattern” mais représente que la moitié de ce pattern. L'autre moitié est module.export, qui est le mécanisme qui nous permet de produire des modules.

/lib/ma_lib.js</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:express_post_bodies_and_params&amp;rev=1459102883&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-27T20:21:23+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:express_post_bodies_and_params</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:express_post_bodies_and_params&amp;rev=1459102883&amp;do=diff</link>
        <description>&lt;- Express routing and CORSCreating a WebSocket server -&gt;

(...)
var bodyParser = require (&quot;body-parser&quot;);

var skierTerms = ...

app.use(bodyParser.urlencoded({ extended: false }));

app.use(function(req,res, next) {
  console.log(`${req.method} request for '${req.url}' - ${JSON.stringify(req.body)}`);
  next();
});

app.use(cors());

app.get(&quot;/dictionary-api&quot;, function(req, res) {
  res.json(skierTerms);
});

app.post(&quot;/dictionary-api&quot;, function(req, res) {
  skierTerms.push(req.body);
  res.j…</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:express_routing_and_cors&amp;rev=1459102725&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-27T20:18:45+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:express_routing_and_cors</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:express_routing_and_cors&amp;rev=1459102725&amp;do=diff</link>
        <description>&lt;- Intro to ExpressExpress post bodies and params -&gt;
	*  npm install corrige souvent bien des problèmes.


(...)
var express = ...
var cors = require(&quot;cors&quot;);

var skierTerms = [{term:&quot;&quot;,defined:&quot;&quot;},{...},...]; // pseudo-code

app.use...

app.use(cors()); // cross origin request truc

app.get(&quot;/dictionary-api&quot;, function(req, res) {
  res.json(skierTerms);
})

(...)</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:file_servers_with_httpster&amp;rev=1458943101&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-25T22:58:21+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:file_servers_with_httpster</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:file_servers_with_httpster&amp;rev=1458943101&amp;do=diff</link>
        <description>&lt;- Installing npms globally on a PCThe package.json file -&gt;

npm -g install httpster // installation globale
npm install httpster // installation locale
npm remove -g httpster // désinstallation globale

httpster -p 3000 -d ./public/ // ne marcheras pas si httpster pas installé en global
./nodes/modules/httpster/bin httpster -p 3000 -d ./public/ //on run avec l'installation locale</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:global_timing_functions&amp;rev=1458499849&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-20T19:50:49+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:global_timing_functions</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:global_timing_functions&amp;rev=1458499849&amp;do=diff</link>
        <description>&lt;- Standard input and standard outputCore modules -&gt;
Un autre moyen de travailler avec nodejs de manière asynchrone (en plus des événements) est d'utiliser la fonction timing pour :

	*  set timeout
	*  clear timeout
	*  set interval
	*  clear interval
	*  de manière similaire à dans le browser</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:handling_events_with_eventemitter&amp;rev=1458590913&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-21T21:08:33+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:handling_events_with_eventemitter</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:handling_events_with_eventemitter&amp;rev=1458590913&amp;do=diff</link>
        <description>&lt;- Collecting information with ReadlineExporting custom modules -&gt;
nodejs.org/api/events.html#events_class_events_eventemitter

“implementation of the pop sop design pattern” (sic ?)

on() -&gt; eventEmitter

Part of the event module


var events = require('events');
var emitter = new events.EventEmitter();
emitter.on('custom_event', function(message, status) {
  console.log(`{status}: ${message}`);
});

emitter.emit('custom_event', 'mon message', 200);</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:hinting_your_code_with_grunt&amp;rev=1459199765&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-28T23:16:05+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:hinting_your_code_with_grunt</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:hinting_your_code_with_grunt&amp;rev=1459199765&amp;do=diff</link>
        <description>&lt;- Checking server responses with CheerioConverting LESS to CSS with Grunt -&gt;
-&gt; gruntjs.com


sudo npm install -g grunt-cli // grunt Command Line Interface
npm install grunt --save-dev
npm install grunt-contrib-jshint --save-dev // si on veut utiliser jshint via grunt


-&gt; GruntFile.js  Grunt recherche un fichier appelé GruntFile.js à la racine du projet

&lt;code&gt;
module.export = function(grunt) {</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:how_node.js_works&amp;rev=1458485838&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-20T15:57:18+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:how_node.js_works</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:how_node.js_works&amp;rev=1458485838&amp;do=diff</link>
        <description>&lt;- Node.js historyInstalling Node.js on a Mac -&gt;
Apache : une requête = un thread -&gt; risque blocage sur une tâche

Node : un thread pour tout le monde, asynchrone, non-blocking event-driven, pas de blocage</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:injecting_dependencies_with_rewire&amp;rev=1459170590&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-28T15:09:50+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:injecting_dependencies_with_rewire</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:injecting_dependencies_with_rewire&amp;rev=1459170590&amp;do=diff</link>
        <description>&lt;- Mocking a server with NockAdvanced testing Sinon spies -&gt;
Possibilité de simuler des modules, pas que des sites. Et notamment des modules pas finis.

SUT : System Under Test

-&gt; npmjs.com/package/rewire

npm install rewire --save-dev


// order-specs.js
var expect = require(&quot;chai&quot;).expect;
var rewire = require(&quot;rewire&quot;);
var order = rewire(&quot;../lib/order&quot;);
  describe(&quot;Ordering Items&quot;, function() {
    beforeEach(function() {
      this.testData = [
        {sku: &quot;AAA&quot;, qty: 10},
        {sku:…</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:installing_dependencies&amp;rev=1458482566&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-20T15:02:46+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:installing_dependencies</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:installing_dependencies&amp;rev=1458482566&amp;do=diff</link>
        <description>&lt;- What you should knowNode.js history -&gt;
npm install

Dans le dossier contenant package.json ?</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:installing_node.js_on_a_mac&amp;rev=1462642500&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-05-07T19:35:00+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:installing_node.js_on_a_mac</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:installing_node.js_on_a_mac&amp;rev=1462642500&amp;do=diff</link>
        <description>&lt;- How Node.js worksInstalling Node.js on a PC -&gt;
-&gt; nodejs.org

Bonus : Linux

Dans les dépôts, Mint Linux à la 0.10.25 qui ne supporte pas les string templates. Pour installer la 4 voir : &lt;https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions&gt;


curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash - &amp;&amp; sudo apt-get install -y nodejs</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:installing_npms_globally_on_a_mac&amp;rev=1462708653&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-05-08T13:57:33+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:installing_npms_globally_on_a_mac</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:installing_npms_globally_on_a_mac&amp;rev=1462708653&amp;do=diff</link>
        <description>&lt;- Installing npms locallyInstalling npms globally on a PC -&gt;
-&gt; La plupart des paquets sont installés localement, car nécessaires à l'application développée.

-&gt; on installe globalement plutôt des outils pour :

	*  améliorer le flux de travail en web dev
	*  conduire des tests
	*  builder des apps</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:installing_npms_locally&amp;rev=1458937393&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-25T21:23:13+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:installing_npms_locally</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:installing_npms_locally&amp;rev=1458937393&amp;do=diff</link>
        <description>&lt;- Collecting POST dataInstalling npms globally on a Mac -&gt;
	*  npm -v : version de npm
	*  npm install &lt;package_name&gt; : installation locale dans un dossier “nodes_modules”
	*  npm remove &lt;package_name&gt; : désinstallation locale (aussi possible : supprimer le dossier correspondant dans le dossier “</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:intro_to_express&amp;rev=1459102535&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-27T20:15:35+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:intro_to_express</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:intro_to_express&amp;rev=1459102535&amp;do=diff</link>
        <description>&lt;- The package.json fileExpress routing and CORS -&gt;
express -&gt; développement d'applications serveur (web  server framework)


var express = require(&quot;express&quot;);

var app = express();

// app.use(express.static(&quot;./public&quot;));
// ou (code à compléter voir page suivante)
app.use(function(req, res, next) {
  console.log(`${req.method} request for '${req.url}'`);
  next();
});

app.listen(3000);

console.log(&quot;Express app running on port 3000&quot;);

module.exports = app;</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:listing_directory_files&amp;rev=1458764381&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-23T21:19:41+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:listing_directory_files</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:listing_directory_files&amp;rev=1458764381&amp;do=diff</link>
        <description>&lt;- Creating child process with spawnReading files -&gt;
fs module -&gt; file system

-&gt; nodejs.org/api/fs.html


var fs = require(&quot;fs&quot;);

var files = fs.readdirSync('./lib'); // lecture synchrone : bloque le thread nodejs
/* fs.readdirSync('./lib', function(error, files) {
  // callback
  if (error) {
    throw error;
  }
  console.log(files);
}); // lecture asynchrone
console.log(&quot;reading files&quot;);
*/

console.log(files);</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:making_a_request&amp;rev=1479922606&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-11-23T18:36:46+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:making_a_request</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:making_a_request&amp;rev=1479922606&amp;do=diff</link>
        <description>&lt;- Readable file streamsBuilding a web server -&gt;
7.01. Making a request

-&gt; nodejs.org/api/http.html

-&gt; nodejs.org/api/https.html

HTTP/HTTPS : un module par protocole, en https on doit fournir un certificat.


var https = require(&quot;https&quot;);
var fs = require(&quot;fs&quot;);

var options = {
  hostname: &quot;en.wikipedia.org&quot;,
  port: &quot;443&quot;, // le port https est souvent 443, peut varier selon les sites
  path: &quot;/wiki/George_Washington&quot;,
  method: &quot;GET&quot;,
};

var res = https.request(options, function(res) {

  …</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:mocking_a_server_with_nock&amp;rev=1459167402&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-28T14:16:42+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:mocking_a_server_with_nock</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:mocking_a_server_with_nock&amp;rev=1459167402&amp;do=diff</link>
        <description>&lt;- Asynchronous mocha testingInjecting dependencies with rewire -&gt;
-&gt; npmjs.com/package/nock

npm install nock --save-dev


// tools-spec.js
(...)
var nock = require(&quot;nock);
(...)
describe(&quot;loadWiki()&quot;, function() {
  before(function() {
    nock(&quot;https://en.wikipedia.org&quot;)
      .get(&quot;/wiki/Abraham_Lincoln&quot;)
      .reply(200, &quot;Mock Abraham Lincoln Page&quot;);
  (...)
    expect(html).to.equal(&quot;Mock Abraham Lincoln Page&quot;);
  (...)
});</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:next_steps&amp;rev=1459203015&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-29T00:10:15+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:next_steps</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:next_steps&amp;rev=1459203015&amp;do=diff</link>
        <description>&lt;- Debugging with npm -&gt;
	*  mongodb.com
	*  firebas.com
	*  travis-ci.com
	*  heroku.com / AWS aws.amazon.com / google</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:node.js_history&amp;rev=1458485602&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-20T15:53:22+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:node.js_history</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:node.js_history&amp;rev=1458485602&amp;do=diff</link>
        <description>&lt;- Installing dependenciesHow Node.js works -&gt;
	*  2009 : création de Node.js
	*  2011 : création de NPM
	*  2014 (déc.) : io.js project forked (volonté d'avoir une gestion ouverte)
	*  2015 (fév.) : création d'une fondation Node.js neutre, avec retour de io.js
	*  2015 (Sept. )  release de Node.js 4.0 mixant nodeJS et io.js (il y a ajamsi eu de 1.0 avant !)</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:rapid_development_with_grunt_watches&amp;rev=1459201706&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-28T23:48:26+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:rapid_development_with_grunt_watches</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:rapid_development_with_grunt_watches&amp;rev=1459201706&amp;do=diff</link>
        <description>&lt;- Bundling client scripts with BrowserifyAutomation with npm -&gt;

(...)
browserify: (...),
watch: {
  css: {
    files: [&quot;less/*.less&quot;], // si ces fichiers sont modifiés
    tasks: [&quot;css&quot;], // grunt doit trigger ces tâches
  },
  scripts: {
    files: [&quot;app-client.js, &quot;lib/*.js&quot;], // si le js bouge
    tasks: [&quot;jshint&quot;, &quot;browserify&quot;], // on run ces tâches
  }
},

(...)

grunt.loadNpmTasks(&quot;grunt-contrib-watch&quot;);</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:readable_file_streams&amp;rev=1458807161&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-24T09:12:41+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:readable_file_streams</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:readable_file_streams&amp;rev=1458807161&amp;do=diff</link>
        <description>&lt;- Renaming and removing directoriesWritable file streams -&gt;
“Give us ways to handle continuous data flows”.

Both stdout &amp; stdin implement the stream interface.

-&gt; nodejs.org/api/stream.html

Récupération de la taille sans stream :


var fs = require(&quot;fs&quot;);

fs.readFile(&quot;file.log&quot;, &quot;UTF-8&quot;, function(error, log) {
  console.log(`File Read ${log.length}`);
});
console.log(&quot;Reading File&quot;);</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:reading_files&amp;rev=1458765420&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-23T21:37:00+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:reading_files</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:reading_files&amp;rev=1458765420&amp;do=diff</link>
        <description>&lt;- Listing directory filesWriting and appending files -&gt;
Si l'on souhaite lire du texte, préciser l'encodage, sinon le module supposera que l'on souhait lire des binaires.


var fs = require(&quot;fs&quot;);

var contents = fs.readFileSync(&quot;./lib/sayings.md&quot;, &quot;UTF-8&quot;); // on précise un encodage, le contenu de contents sera du texte.

console.log(contents);</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:renaming_and_removing_directories&amp;rev=1458769958&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-23T22:52:38+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:renaming_and_removing_directories</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:renaming_and_removing_directories&amp;rev=1458769958&amp;do=diff</link>
        <description>&lt;- Renaming and removing filesReadable file streams -&gt;
	*  rename
	*  rmdir


var fs = require(&quot;fs&quot;);

fs.renameSync(&quot;dir_1&quot;,&quot;dir_2&quot;);
fs.rmdirSync(&quot;dir_2&quot;); // le dossier doit être vide pour pouvoir être supprimé</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:renaming_and_removing_files&amp;rev=1458769125&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-23T22:38:45+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:renaming_and_removing_files</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:renaming_and_removing_files&amp;rev=1458769125&amp;do=diff</link>
        <description>&lt;- Directory creationRenaming and removing directories -&gt;
	*  renameSync
	*  unLink


var fs= require(&quot;fs&quot;);

fs.renameSync(&quot;file.js&quot;, &quot;file.json&quot;);
fs.rename(&quot;file.js&quot;, &quot;file.json&quot;, function(error) {
  if (error) { console.log(error);
  } else { console.log(&quot;fichier renommé&quot;); }
});
try {
  fs.unlinkSync(&quot;file.json&quot;);
} catch (error) {
  console.log(error);
}

fs.unLink(&quot;file.json&quot;, function(error) {
  if (error) {
    console.log(error);
  } else {
    console.log(&quot;ok&quot;);
  }</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:serving_files&amp;rev=1458934389&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-25T20:33:09+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:serving_files</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:serving_files&amp;rev=1458934389&amp;do=diff</link>
        <description>&lt;- Building a web serverServing JSON data -&gt;

var http =  require(&quot;http&quot;);
var fs = require(&quot;fs&quot;);
var pas = require(&quot;path&quot;);

http.createServer(function(req, res){
  console.log(`${req.method} request for ${req.url}`);

  if (req.url === &quot;/&quot;) {
  
    fs.readFile(&quot;./public/index.html&quot;, &quot;UTF-8&quot;, function(error, html) {
      res.write(200, {&quot;Content-Type&quot;: &quot;text/html&quot;});
      res.end(html);
    });
    
  } else if (req.url.match(/.css$/)) {
  
    var cssPath = path.join(__dirname, 'public', r…</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:serving_json_data&amp;rev=1458935774&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-25T20:56:14+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:serving_json_data</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:serving_json_data&amp;rev=1458935774&amp;do=diff</link>
        <description>&lt;- Serving filesCollecting POST data -&gt;

var http = require(&quot;http&quot;);

var data = require(&quot;./data/inventory&quot;);

http.createServer(function(req, res) {

  if (req.url === &quot;/&quot;) {
    res.writeHead(200, {&quot;Content-Type&quot;: &quot;text/json&quot;});
    res.end(JSON.stringify(data));
  } else if (req.url === &quot;/instock&quot;) {
    listInStock(res);
  } else if (req.url === &quot;/onorder&quot;) {
    listOnOrder(res);
  } else {
    res.writeHead(404, {&quot;Content-Type&quot;: &quot;text/plain&quot;});
    res.end(&quot;Whoops... Data not found&quot;);
  }
…</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:standard_input_and_standard_output&amp;rev=1458496620&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-20T18:57:00+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:standard_input_and_standard_output</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:standard_input_and_standard_output&amp;rev=1458496620&amp;do=diff</link>
        <description>&lt;- Argument variables with process.argvGlobal timing functions -&gt;
-&gt; nodejs.org/api/process.html#process_process_stdin

/!\ attention, le support des template strings est récent et arrivé via io.js, du coup avec une vieille version genre la version 0.10.25 des dépôts Mint Linux c'est mort ! Voir install Mac, j'ai fait un addendum.</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:testing_http_endpoints_with_supertest&amp;rev=1459177401&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-28T17:03:21+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:testing_http_endpoints_with_supertest</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:testing_http_endpoints_with_supertest&amp;rev=1459177401&amp;do=diff</link>
        <description>&lt;- Code coverage with IstanbulChecking server responses with Cheerio -&gt;
Tester les applications http comme les apps express.

-&gt; npmjs.com/package/supertest

npm install supertest --save-dev


// app-spec.js
var request = require(&quot;supertest&quot;);
(...)

it(&quot;Loads the home page&quot;, function(done) {
  request(app).get(&quot;/&quot;).expect(200).end(done);
});

(...)

it(&quot;GETS dictionary-api&quot;, function(done) {
  request(app).get(&quot;/dictionary-api&quot;).expect(200).end(done);
});

it(&quot;POSTS dictionary-api&quot;, function(do…</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:testing_with_mocha_and_chai&amp;rev=1462356898&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-05-04T12:14:58+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:testing_with_mocha_and_chai</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:testing_with_mocha_and_chai&amp;rev=1462356898&amp;do=diff</link>
        <description>&lt;- Creating WebSockets with Socket.IOAsynchronous mocha testing -&gt;
-&gt; mochajs.org

-&gt; sudo npm install -g mocha

Se démarre avec la commande mocha. Par défaut va rencontrer une erreur :

cannot resolve path (or pattern) 'test'

Car il faut créer le répertoire test et y mettre des tests.


// tool-spec.js
describe(&quot;printName()&quot;, function() {
  it(&quot;should print the last name first&quot;);
}</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:the_global_object&amp;rev=1458488469&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-20T16:41:09+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:the_global_object</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:the_global_object&amp;rev=1458488469&amp;do=diff</link>
        <description>&lt;- Installing Node.js on a PCArgument variables with process.argv -&gt;
Avec nodejs, global est l'objet global

-&gt; nodejs.org/api/globals.html : objets accessibles globalement, avec le namespace global


console.log(&quot;hello world!&quot;);


variables

Nodejs fonctionne un peu différemment du navigateur concernant le stockage de variable.</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:the_package.json_file&amp;rev=1459102064&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-27T20:07:44+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:the_package.json_file</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:the_package.json_file&amp;rev=1459102064&amp;do=diff</link>
        <description>&lt;- File servers with httpsterIntro to Express -&gt;
	*  npm init : créé package.json (demande des informations : nom du paquet/version/description/entry point/test command/git repository/keywords/author/licence)

On peut créer le JSON a  la main, mais npm init rend cela plus simple.

Le fichier package.json keep track des dépendances</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:welcome&amp;rev=1458482350&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-20T14:59:10+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:welcome</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:welcome&amp;rev=1458482350&amp;do=diff</link>
        <description>&lt;- What you should know -&gt;
	*  event-driven
	*  asynchronous
	*  non-blocking I/O model

	*  event loop at the core of nodejs
	*  single-threaded application can handle many connection quickly

D'abord :

	*  streams
	*  file system
	*  http module

Puis :

	*  express
	*</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:what_you_should_know&amp;rev=1458482444&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-20T15:00:44+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:what_you_should_know</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:what_you_should_know&amp;rev=1458482444&amp;do=diff</link>
        <description>&lt;- WelcomeInstalling dependencies -&gt;
	*  Javascript
	*  ES6
	*  Ligne de commande
	*  Git et Github</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:writable_file_streams&amp;rev=1458807772&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-24T09:22:52+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:writable_file_streams</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:writable_file_streams&amp;rev=1458807772&amp;do=diff</link>
        <description>&lt;- Readable file streamsMaking a request -&gt;

(...)
// open
var stream = fs.createWriteStream('filename');
// stream data
stream.write(data);
// close
stream.close();</description>
    </item>
    <item rdf:about="https://www.wiki.leomartin.net/doku.php?id=njsetn:writing_and_appending_files&amp;rev=1458766656&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2016-03-23T21:57:36+00:00</dc:date>
        <dc:creator>Anonymous (anonymous@undisclosed.example.com)</dc:creator>
        <title>njsetn:writing_and_appending_files</title>
        <link>https://www.wiki.leomartin.net/doku.php?id=njsetn:writing_and_appending_files&amp;rev=1458766656&amp;do=diff</link>
        <description>&lt;- Reading filesDirectory creation -&gt;
	*  créer de nouveaux fichiers
	*  écrire un contenu texte ou binaire dans ces fichiers
	*  ajouter un contenu texte ou binaire à des fichiers existants.

	*  fs.writeFile
	*  fs.appendFile


var fs = require(&quot;fs&quot;);

var md = `

Sample Markdown Title
=====================

Sample subtitle
---------------

* point
* point
* point

`;

fs.writeFile(&quot;sample.md&quot;, md.trim(), function(error) {
  console.log(&quot;Fichier créé.&quot;);
});</description>
    </item>
</rdf:RDF>
