neu.Nodeのイベントを開きました&いじって分かった事

イベントの内容はYou+に書いた内容にお任せするとして、色々試して分かった事などをまとめておきます。

モジュールのロード

/nuenode/apps/以下には~.htmlというローダーファイルがあります。ローダーファイルはHTMLで記述されていて、*.js側でrequire()するものを記述しておく必要があります。

サンプルに含まれているものにはfsモジュールを使ったものが無かったので、これをHTMLに記載、jsでロードしてみようとしたのですが、これが何故か実行時にエラーになってしまう。

<html>
<header>
</header>
  <body></body>
  <script src="./global.js"></script>
  <script src="./util.js"></script>
  <script src="./events.js"></script>
  <script src="./punycode.js"></script>
  <script src="./querystring.js"></script>
  <script src="./url.js"></script>
  <script src="./path.js"></script>
  <script src="./stream.js"></script>
  <script src="./assert.js"></script>
  <script src="./freelist.js"></script>
  <script src="./dns.js"></script>
  <script src="./net.js"></script>
  <script src="./http.js"></script>
  <script src="./mime.js"></script>
  <script src="./static.js"></script>
  <script src="./web.js"></script>
  <script src="./fs.js"></script>
</html>

エラー内容は以下の通り。

2013-01-22 16:25:54.722 neunode[7970:11303] *** ALERT *** No module named fs

少し悩んでscriptタグの順序に規則がある事が分かりました。
web.jsは「Static Web Server」アプリのメインファイルで、ライブラリは全てその前に記載されていました。
ですので、正しくは以下の通り、web.jsよりも前にfs.jsを書く必要がありました。

<html>
<header>
</header>
  <body></body>
  <script src="./global.js"></script>
  <script src="./util.js"></script>
  <script src="./events.js"></script>
  <script src="./punycode.js"></script>
  <script src="./querystring.js"></script>
  <script src="./url.js"></script>
  <script src="./path.js"></script>
  <script src="./stream.js"></script>
  <script src="./assert.js"></script>
  <script src="./freelist.js"></script>
  <script src="./dns.js"></script>
  <script src="./net.js"></script>
  <script src="./http.js"></script>
  <script src="./mime.js"></script>
  <script src="./static.js"></script>
  <script src="./fs.js"></script>
  <script src="./web.js"></script>
</html>

web.jsは以下の通り。

var server = require('http').createServer(handler);
var static = require('static').createServer(__dirname + '/web', {} );
var util = require('util');
var fs = require('fs');


fs.writeFile('/message.txt', 'Hello Node', function (err) {
  if (err) throw err;
  console.log('It\'s saved!');
});


server.listen(8000, function() {
  var address = server.address();
  console.log('Server is running at http://%s:%d', address.address, address.port);
  console.log('Access this URL with your browser.');
});

function handler(req, res) {
  req.on('end', function() {
    static.serve(req, res, function(err) {
      if (err) { 
        console.log("app file > Error serving " + req.url + " - " + err);
        err.headers['Content-Type'] = 'text/html; charset=UTF-8';
        res.writeHead(err.status, err.headers);
        res.end(util.format("<h1>%d : %s<h1>", err.status, err.message));
      }
    });
  });
}

ファイルの出力先

上記でfs.writeFile()でファイルを出力しています。
ドキュメントには以下の様にあります。

ファイル名が '/_doc/' で始まる場合は、Document ディレクトリ内のファイルにアクセスします。 ファイル名が '/_prv/' で始まる場合は、Library ディレクトリ内のファイルにアクセスします。 それ以外の場合は、メインバンドルの ’root' ディレクトリ内のファイルにアクセスします。

が、'/_doc/'と'/_prv/'はそのままのディレクトリ名でアクセスしてしまい、正しく出力できませんでした。

(「Static Web Server」の場合)

~/Library/Application Support/iPhone Simulator/6.0/Applications/********/com.yourcompany.web

がルート(?)になり、上記のweb.jsで、ファイル名の先頭に'/'が無いと「com.yourcompany.webmessage.txt」になってしまいます。

__dirname + '/message.txt'

とした方が良さそうです。

ローダーファイルの中身は画面に表示されない

ローダーファイル(web.html)のbodyの中身などは表示されないようです。
が、Safariのインスペクタでは中身を取得したり、コンソールから

alert(1);
document.body.innerHTML

なども可能でしたので、表示しないだけのようです。

デバッグ
JavaScript で記述された)neu.Node をデバッグするためには、以下のことが必要です。

  • Xcode 上でアプリを実行する。
  • Macの)Safari で「開発 -> デバイス名 -> アプリ名 」を選択し、 Web インスペクタを自作のアプリにアタッチする。

iPhone / iPad のアプリケーション設定で、Safari -> 詳細 -> Webインスペクタをオンにする必要があります。

サーバ機能+クライアント機能を実装する場合はどうしようかな。

また色々触ってみよう。