私は経験豊富なプログラマーですが、nodejs、nedb、Mocha には比較的慣れていません。
nedb は、少量のデータを使用するための nodejs npm モジュールであり、Mongodb で使用されるインターフェースの一部を複製します。これを選択したのは、Beaglebone Black または Raspberry Pi で実行するアプリを作成しており、小さなデータのニーズに対して Mongodb のオーバーヘッドが必要なかったからです。
ただし、nedb のファイル名のパス部分に問題があります。作業中の myapp.js が現在のパスに対してローカルで呼び出された場合は問題なく動作しますが、Mocha テスト ディレクトリなどの別のディレクトリから呼び出した場合、nedb は同じパスでは動作しません。相対パスでも機能しません。Mocha テスト ディレクトリから動作させるには、/home で始まるフル パスを指定する必要があります。言うまでもなく、これは本番環境では /home のベースで実行されていないため、不便であり、本番環境では禁止されています。
次のコードで、myapp.js は私が開発およびテストしているアプリケーションです。useMyapp.js は、簡単にするために myapp.js を使用するためのユーティリティ テストです。これらはすべて同じディレクトリにあり、useMyapp.js を呼び出すと正しく機能します。
myapp.js は /home/geek/project/public/javascripts/ にあります
myapp.js のコードは次のとおりです。
var Datastore = require("nedb");
var db = new Datastore({filename: "./calEvents.db", autoload: true});
function Myapp(year, month) {
console.log('myapp: year: ' + year + ', month: ' + month);
this.year = year;
this.month = month;
}
Myapp.prototype.getAllData = function() {
db.find({}, function(err, docs) {
if(err) {
console.error('error: ', err);
} else {
console.log(" docs found: ", docs);
}
});
};
module.exports = Myapp;
useMyapp.js は /home/geek/project/public/javascripts/ の同じディレクトリにあります。
useMyapp.js のコードを次に示します。これは正しく機能し、予想される nedb レコードを出力します。
var Myapp = require("./myapp");
var myapp = new Myapp(2016, "Mar");
myapp.getAllData();
useMyapp.js を Mocha テスト ディレクトリにコピーし、名前を TestUseMyapp.js に変更して、/home/geek/project/test/ に移動しました。require ステートメントを myapp.js への相対パスに調整しました。ホーム/オタク/プロジェクト/テスト/
var Myapp = require("../public/javascripts/myapp");
var myapp = new Myapp(2016, "Mar");
myapp.getAllData();
これを nodejs 経由で実行した場合の出力は、空のデータ セットです: docs found: []
問題: TestUseMyapp.js は「require」ステートメントに従って myapp.js を見つけてロードできますが、myapp.js が別のディレクトリから呼び出されると、nedb のファイル名パラメーターが機能しません。ファイルパスがすべて異なるため、開発、Mocha テスト、および本番環境での実行の間で問題が発生しています。
myapp.js の複製を作成し、myapp2.js という名前を付けて、/home/geek/project/public/javascripts の myapp.js と同じディレクトリに保存しました。これで、nedb ファイル名パラメーターのパスを変更しました。myapp2.js のコードは次のとおりです。唯一の変更点は、ファイル名のパラメーター パスであることに注意してください。
var Datastore = require("nedb");
var db = new Datastore({filename: "/home/geek/project/public/javascripts/calEvents.db", autoload: true});
function Myapp(year, month) {
console.log('myapp: year: ' + year + ', month: ' + month);
this.year = year;
this.month = month;
}
Myapp.prototype.getAllData = function() {
db.find({}, function(err, docs) {
if(err) {
console.error('error: ', err);
} else {
console.log(" docs found: ", docs);
}
});
};
module.exports = Myapp;
フル パスを使用して myapp2.js に対してテストを呼び出したとき、これは期待どおりに機能します。
質問: 開発、Mocha テスト、本番環境への展開の間でファイル名パスを変更する必要がないように、nedb でファイル名パスの問題を解決するにはどうすればよいですか?
ありがとう!