如何通过Node.js

时间:2016-03-04 18:52:50

标签: javascript node.js sqlite

我正在关注 Node Craftsman Book ,并发现自己无法连接到SQLite3数据库。

根据这本书,我应该可以使用DBWrapper并包含一个路径,如下面dbSessions.js的screencap中所示:

enter image description here

我知道数据库存在,因为我可以使用DB Browser for SQLite打开它。

enter image description here

我知道服务器正在运行:

Server started and listening on port 8080

但是当我进行测试时,它会超时。我怎么能告诉我是否连接?即使我不相信我在联系。

enter image description here

  

我可以使用的最接近的信息是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();
                            }
                        );
                }
            );

    });
});

1 个答案:

答案 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在两年内没有被触及,所以可能不是最好的选择。