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 をデバッグするためには、以下のことが必要です。iPhone / iPad のアプリケーション設定で、Safari -> 詳細 -> Webインスペクタをオンにする必要があります。
サーバ機能+クライアント機能を実装する場合はどうしようかな。
また色々触ってみよう。