我正在关注 Node Craftsman Book ,并发现自己无法连接到SQLite3数据库。
根据这本书,我应该可以使用DBWrapper并包含一个路径,如下面dbSessions.js的screencap中所示:
我知道数据库存在,因为我可以使用DB Browser for SQLite打开它。
我知道服务器正在运行:
Server started and listening on port 8080
但是当我进行测试时,它会超时。我怎么能告诉我是否连接?即使我不相信我在联系。
我可以使用的最接近的信息是mlaccetti's answer here。也许书中的说明不正确?要么 我错过了什么?
这是我的代码:
index.js
'use strict';
var percolator = require('percolator').Percolator;
var dbSession = require('./dbSessions.js');
var port = 8080;
var server = percolator({'port': port, 'autoLink': false});
server.route('/api/keywords',
{
GET: function(req, res) {
dbSession.fetchAll('SELECT id, value, categoryID FROM keyword ORDER BY id',
function(err, rows) {
if(err) {
console.log(err);
res.status.internalServerError(err);
} else {
res.collection(rows).send();
}
});
}
}
);
server.listen(function(req, res) {
console.log('Server started and listening on port', port);
});
dbSessions.js
'use strict';
var DBWrapper = require('node-dbi').DBWrapper;
var dbWrapper = new DBWrapper('sqlite3', {'path': '../../data/keyword-wrangler2.test.sqlite'});
dbWrapper.connect();
module.exports = dbWrapper;
apiSpec.js
'use strict';
var request = require('request');
var dbSession = require('../../src/backend/dbSessions.js');
var resetDatabase = require('../resetDatabase.js');
var async = require('async');
describe('The API', function() {
it('should respond to a GET request at/api/keywords', function(done) {
var expected = {
"_items": [
{'id': 1, 'value': 'Aubergine', 'categoryID': 1},
{'id': 2, 'value': 'Onion', 'categoryID': 1},
{'id': 3, 'value': 'Knife', 'categoryID': 2}
]
};
async.series(
[
function(callback) {
resetDatabase(dbSession, callback);
},
function(callback) {
dbSession.insert(
'keyword',
{'value': 'Aubergine', 'categoryID': 1},
function(err) { callback(err); });
},
function(callback) {
dbSession.insert(
'keyword',
{'value': 'Onion', 'categoryID': 1},
function(err) { callback(err); });
},
function(callback) {
dbSession.insert(
'keyword',
{'value': 'Knife', 'categoryID': 2},
function(err) { callback(err); });
}
],
function(err, results) {
request.get(
{
'url': 'http://localhost:8080/api/keywords/',
'json': true
},
function(err, res, body) {
expect(res.statusCode).toBe(200);
expect(body).toEqual(expected);
done();
}
);
}
);
});
});
答案 0 :(得分:0)
在我尝试提供帮助之前,你最好在代码的某处放置一个git repo;试图从几个文件(即package.json,test等)重新创建你的项目是耗时的,而不是我可能再做的事情。
那就是说,我确实把它当作旋转,并认为最可能的情况是打开数据库文件时出现问题。 dbWrapper.connect()
实际上并不是同步的,因此在建立连接时使用回调可能是有意义的,以确保事物确实存在。仅出于测试目的,我做了以下内容:
dbWrapper.connect(function(err) {
console.log('Connected to DB: ', err);
});
虽然我创建了sqlite数据库文件,但路径引用基于我运行应用程序的方式是错误的(即node src/index.js
使我使用的../data
路径不正确,并出现以下错误报道:Connected to DB: { [Error: SQLITE_CANTOPEN: unable to open database file] errno: 14, code: 'SQLITE_CANTOPEN' }
一旦我修改了路径,就可以找到该文件,而这似乎有效。
PS-node-dbi在两年内没有被触及,所以可能不是最好的选择。