pugを使いたい node.jsをupdate

pugを使いたい。で、node.jsのvをみる。
[vagrant@localhost python]$ node -v
v0.10.48
[vagrant@localhost python]$ npm -v
1.3.6

あれ、古くないか?

https://nodejs.org/ja/download/releases/
最新だと、10.7.0ですね。0.10.48ってどういうことだ?

[vagrant@localhost python]$ git clone git://github.com/creationix/nvm.git ~/.nvm
Initialized empty Git repository in /home/vagrant/.nvm/.git/
remote: Counting objects: 7182, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 7182 (delta 10), reused 17 (delta 8), pack-reused 7163
Receiving objects: 100% (7182/7182), 2.22 MiB | 439 KiB/s, done.
Resolving deltas: 100% (4517/4517), done.
[vagrant@localhost python]$ source ~/.nvm/nvm.sh
[vagrant@localhost python]$ nvm ls

-> system
iojs -> N/A (default)
node -> stable (-> N/A) (default)
unstable -> N/A (default)
[vagrant@localhost python]$ nvm ls-remote

[vagrant@localhost python]$ nvm install 10.7.0

[vagrant@localhost python]$ nvm use 10.7.0
Now using node v10.7.0 (npm v6.1.0)
[vagrant@localhost python]$ node -v
v10.7.0

はああああああああああ? v10.7.0になりました。なんだこりゃ。

[vagrant@localhost python]$ npm -v
6.1.0

はあああああああああああああああああ?

node.jsが入っているのに、npmコマンドが使えない時

# node server.js
module.js:340
Cannot find module ‘lodash’

npm install lodash –save で、npmインストールしようとしたが、できない。

$ sudo yum groupinstall 'Development tools'
$ wget http://nodejs.org/dist/v0.12.0/node-v0.12.0.tar.gz
$ tar xvf node-v0.12.0.tar.gz
$ cd node-v0.12.0/
$ ./configure --prefix=/usr/local
$ make
$ sudo make install

ほぅ

Node.js Socket.IOによるチャットルーム作成

まず、soket.ioのフォルダを作り、nmpでSocket.ioをインストールします。

[vagrant@localhost ~]$ mkdir socket.io
[vagrant@localhost ~]$ cd socket.io
[vagrant@localhost socket.io]$ node -v
v0.10.46
[vagrant@localhost socket.io]$ npm install socket.io

socket.io
socket.ioとは、ブラウザ・node.jsのライブラリで、Websocketの技術を使っています。
Socket.IO is a JavaScript library for realtime web applications. It enables realtime, bi-directional communication between web clients and servers. It has two parts: a client-side library that runs in the browser, and a server-side library for node.js. Both components have a nearly identical API. Like node.js, it is event-driven.
Socket.IO primarily uses the WebSocket protocol with polling as a fallback option, while providing the same interface. Although it can be used as simply a wrapper for WebSocket, it provides many more features, including broadcasting to multiple sockets, storing data associated with each client, and asynchronous I/O.
It can be installed with the npm tool.

では、app.jsとindex.htmlでサーバーサイドとクライアントサイドのウェブソケットを実装してみましょう。
app.js

var app = require('http').createServer(handler),
  io = require('socket.io').listen(app),
  fs = require('fs')
app.listen(1337);
function handler(req, res){
  fs.readFile(__dirname + '/index.html', function(err, data){
    if (err){
      res.writeHead(500);
      return res.end('Error');
    }
    res.writeHead(200);
    res.write(data);
    res.end();
  })
}
io.sockets.on('connection', function(socket){
  socket.on('emit_from_client', function(data){
    // console.log(data);
   // 接続しているソケットのみ
    //  socket.emit('emit_from_server', 'hello from server: ' + data);
   // 接続しているソケット以外全部
    // socket.broadcast.emit('emit_from_server', 'hello from server: ' + data);
    // 接続しているソケット全部
    // socket.client_name = data.name;
    //   io.sockets.emit('emit_from_server', '[' + socket.client_name + '] : ' + data.msg);
    socket.join(data.room);
    socket.emit('emit_from_server', 'you are in ' + data.room);
    socket.broadcast.to(data.room).emit('emit_from_server', data.msg);
  });
});

index.html

<!doctype html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>socket.ioの練習</title>
</head>
<body>
  <form id="myForm">
    <select id="rooms">
      <option value="room-1">Room 1</option>
      <option value="room-2">Room 2</option>
    </select>
    <input type="text" id="msg">
    <input type="submit" value="Send!">
  </form>
  <ul id="logs"></ul>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script src="/socket.io/socket.io.js"></script>
  <script>
  $(function(){
    var socket = io.connect();
    // emit: イベントを発信している
    // on: イベントを待ち受けている
    $('#myForm').submit(function(e){
      e.preventDefault();
      socket.json.emit('emit_from_client', {
        msg: $('#msg').val(),
        room: $('#rooms').val()
      });
      $('#msg').val('').focus();
    });
    socket.on('emit_from_server', function(data){
      $('#logs').append($('<li>').text(data));
    });
  });
  </script>
</body>
</html>

ブラウザを三つ立ち上げて、ローカル環境でテストしてみてください。
%e7%84%a1%e9%a1%8c

Node.jsでWebサーバーを作ってみよう

server.js

var http = require('http');
var server = http.createServer();
server.on('request', function(req, res){
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write('hello world');
  res.end();
});
server.listen(1337, '192.168.33.10');
console.log("server listening ...");
[vagrant@localhost nodejs]$ node server.js
server listening ...

ブラウザ
%e7%84%a1%e9%a1%8c

Node.js ノンブロッキング処理

Node.jsのノンブロッキング処理を見てみましょう。下記のように、コールバック関数を実装すれば、次の処理をブロックしませんの、”world”を先にwriteします。

hello.js

setTimeout(function(){
  console.log("hello");
}, 1000);
console.log("world");
[vagrant@localhost nodejs]$ node hello.js
world
hello

コールバックの仕組みですね。
/*
Node is all about non-blocking, asynchronous architecture. This means any activity taking a long time to finish, such as file access, network communication, and database operations, are requested and put aside until the results are ready and returned via a callback function. Instead of asking to read a file and waiting for the operating system to come back with a file handler or buffer, the a callback function is invoked when the operation is completed, freeing the server to handle additional requests.
*/