我是一位经验丰富的程序员,但对 nodejs、nedb、Mocha 比较陌生。
nedb 是一个用于小数据使用的 nodejs npm 模块,它复制了 Mongodb 中使用的一些接口。我选择它是因为我正在构建一个在 Beaglebone Black 或 Raspberry Pi 上运行的应用程序,并且不希望 Mongodb 的开销满足我的小数据需求。
但是,我遇到了 nedb 文件名的路径部分的问题。如果我正在处理的 myapp.js 在当前路径的本地调用它工作正常,但如果我从不同的目录调用它,比如我的 Mocha 测试目录,那么 nedb 将无法使用相同的路径。它也不适用于相对路径;我必须指定完整路径,从 /home 开始,然后才能从 Mocha 测试目录中运行它。不用说,这既不方便,又不适合生产,因为它不是在生产中以 /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/我调整了myapp.js相对路径的require语句这是TestUseMyapp.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,并将其保存在与 myapp.js 相同的目录中 /home/geek/project/public/javascripts。在此,我更改了 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 调用测试时,这按预期工作。
问题:如何解决 nedb 的文件名路径问题,这样我就不必在开发、Mocha 测试和部署到生产之间进行更改?
谢谢!