カテゴリー : Node.js

[Node.js] ファイルの拡張子を取得する path.extname

Node.js の path module を使って、下記のようにファイルの拡張子を取得することができます。

path.extname('index.html')
// returns
'.html'
 
path.extname('index.coffee.md')
// returns
'.md'
 
path.extname('index.')
// returns
'.'
 
path.extname('index')
// returns
''

参考情報

Path Node.js v0.10.26 Manual & Documentation

[Node.js] RangeError: Maximum call stack size exceeded

Node.js で、RangeError: Maximum call stack size exceeded エラーが発生したときの対応方法をメモ。

% node -v
v0.10.26
 
% node --v8-options | grep -B0 -A1 stack_size
  --stack_size (default size of stack region v8 is allowed to use (in kBytes))
        type: int  default: 984

Node.js version 0.10.26 は、デフォルトの stack size は 984 KB です。

% node -h 
...
 
Options:
  --max-stack-size=val set max v8 stack size (bytes)
 
...

ヘルプには –max-stack-size で指定すると書いてありますが、

node --max-stack-size=val

v0.10.x 以上だと

node --stack-size=val

–stack-size で指定するっぽいです。


参考情報

What is the default stack size in Node.js? – Stack Overflow

javascript – How can I increase the maximum call stack size in Node.js – Stack Overflow

[Node.js] ファイルの存在チェック

Node.js で、viewファイルの存在チェックして、無ければリダイレクトさせる処理をメモ。

var fs = require('fs');
 
var template = 'novels/'+ title + '.jade';
var templateFilePath = 'views/' + template;
 
fs.stat(templateFilePath, function(e) {
  if (e) {
    console.error(templateFilePath + " file does't exist.");
    return res.redirect('/novels');
  }
 
  return res.render(template);
});

ここでは、テンプレートエンジンは jade を使っているという前提で、動的に生成したファイル名に対応する jade ファイルが存在するかチェックしています。

[Node.js][node-csv] Error: Invalid closing quote at line 1; found ” ” instead of delimiter “\t”

Node.js で使える CSV Parser node-csv でタブ区切りテキストの中にダブルクオーテーション ” を含めていたら下記のようなエラーが発生しました。

wdavidw/node-csv

Error: Invalid closing quote at line 1; found " " instead of delimiter "\t"
  at [object Object].Parser.write (/u/apps/com/shared/node_modules/csv/lib/parser.js:104:29)
  at [object Object].CSV.write (/u/apps/com/shared/node_modules/csv/lib/index.js:275:17)
  at write (_stream_readable.js:583:24)
  at flow (_stream_readable.js:592:7)
  at ReadStream.pipeOnReadable (_stream_readable.js:624:5)
  at ReadStream.EventEmitter.emit (events.js:92:17)
  at emitReadable_ (_stream_readable.js:408:10)
  at emitReadable (_stream_readable.js:404:5)
  at readableAddChunk (_stream_readable.js:165:9)
  at ReadStream.Readable.push (_stream_readable.js:127:10)
  at onread (fs.js:1561:12)
  at Object.wrapper [as oncomplete] (fs.js:454:17)

一部、手動で作成したCSVファイルだったので、ダブルクオーテーションを消して解決しました。


参考情報

double quotes in a tab-delimited file throws error · Issue #46 · wdavidw/node-csv

[Node.js][Express] Error: Request Entity Too Large

Express で大きいサイズのファイルをPOSTしたら Request Entity Too Large というエラーが発生した。

エラーメッセージ

Error: Request Entity Too Large
  at Object.exports.error (/u/apps/com/shared/node_modules/express/node_modules/connect/lib/utils.js:63:13)
  at limit (/u/apps/com/shared/node_modules/express/node_modules/connect/lib/middleware/limit.js:51:47)
  at multipart (/u/apps/com/shared/node_modules/express/node_modules/connect/lib/middleware/multipart.js:102:5)
  at /u/apps/com/shared/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js:57:9
  at urlencoded (/u/apps/com/shared/node_modules/express/node_modules/connect/lib/middleware/urlencoded.js:52:72)
  at /u/apps/com/shared/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js:55:7
  at json (/u/apps/com/shared/node_modules/express/node_modules/connect/lib/middleware/json.js:54:55)
  at Object.bodyParser [as handle] (/u/apps/com/shared/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js:53:5)
  at next (/u/apps/com/shared/node_modules/express/node_modules/connect/lib/proto.js:193:15)
  at Object.cookieParser [as handle] (/u/apps/com/shared/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js:60:5)
  at next (/u/apps/com/shared/node_modules/express/node_modules/connect/lib/proto.js:193:15)
  at Object.expressInit [as handle] (/u/apps/com/shared/node_modules/express/lib/middleware.js:30:5)
  at next (/u/apps/com/shared/node_modules/express/node_modules/connect/lib/proto.js:193:15)
  at Object.query [as handle] (/u/apps/com/shared/node_modules/express/node_modules/connect/lib/middleware/query.js:44:5)
  at next (/u/apps/com/shared/node_modules/express/node_modules/connect/lib/proto.js:193:15)
  at Function.app.handle (/u/apps/com/shared/node_modules/express/node_modules/connect/lib/proto.js:201:3)
  at Server.app (/u/apps/com/shared/node_modules/express/node_modules/connect/lib/connect.js:65:37)
  at Server.EventEmitter.emit (events.js:98:17)
  at HTTPParser.parser.onIncoming (http.js:2108:12)
  at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:121:23)
  at Socket.socket.ondata (http.js:1966:22)
  at TCP.onread (net.js:527:27)

bodyParser の limit オプションの値を変更して、アップロードするファイルサイズ制限を上げればよいです。

全 routing に適用する書き方

app.use(express.bodyParser({
  limit: '1024mb'
}));

/upload に適用する書き方

app.use('/upload', express.bodyParser({
  limit: '1024mb'
}));

特定の URL だけ limit を変更する書き方

var defaultBodyParser = express.bodyParser({
  limit: "5mb"
});
var extendedBodyParser = express.bodyParser({
  limit: "1024mb"
});
 
app.use(function(req, res, next) {
  if (req.url === '/upload') {
    return defaultBodyParser(req, res, next);
  } else {
    return extendedBodyParser(req, res, next);
  }
});

以上です。


参考情報

[Node.js] Express でホスト名 (host name) を取得する

Express (Node.js) でホスト名を取得するには、

request.headers.host

HTTP リクエストヘッダーを見ればいい。

別に、Express に限ったことじゃないけど。


参考情報

node.js – Node JS get server hostname of current process – Stack Overflow

[Node.js] Mongoose で簡易的な auto increment を実装する

Node.js + Mongoose で auto increment の実装をご紹介します。

mongoose

続きを読む

[Node.js] base62-node が base62.js へリネームされていた

npm モジュール base62-node が base62.js へリネームされたようで、使い方もちょっと変わっていたのでメモ。

base62-node

base62-node では new で新しくオブジェクトを生成して、使ってました。

> var Base62 = require('base62-node');
> var base62 = new Base62('09azAZ');
> base62.encode(123);
'1Z'

base62.js

それが、base62.js だと createConverter() メソッドでコンバーターのインスタンスを受け取るという使い方に変更されていました。

> var base62js = require('base62.js');
> base62js
{ table_: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
  createConverter: [Function: createConverter] }
 
> var base62 = base62js.createConverter();
> base62.encode(123);
'1Z'

以上です。

[Node.js] 開発環境で使うデーモン化、プロセス管理ツールいくつか

Node.js の開発環境で使うデーモン化、プロセス管理ツールをいくつかご紹介します。(github の star 順)

remy/nodemon

isaacs/node-supervisor

fgnass/node-dev

nodemon 0.7.10, node-supervisor 0.5.6, node-dev 2.1.0 で確認したところ、プロセスが死んでも再度アクセスすれば再起動してくれるのは「node-supervisor」だけだったようでした。

今まで、node-dev の古いバージョン使っていたのですが、アップグレードしたらこの機能が無くなっていたので、node-supervisor へ乗り換えました。

[Jade] partial is deprecated

Jade の最新版だと partial は廃止されてます。

partial 使ってもコードはレンダリングされない

extends layout
 
block content
  h1 Invoices:
  != partial("invoice")

Jade newest version doesn’t support partials. You might be following outdated tutorials. Please read up on jade documentation here

partial 使えないので mixin 使いましょう。


参考情報

node.js – Partial Not Defined in Jade – Stack Overflow