为什么我的 API 说 fetchAll 不是函数?

Why is my API saying fetchAll is not a function?

我让它与 hapi-shelf 一起工作,但我试图获得 jsonapi 响应,但找不到用它实现 bookshelf-jsonapi-parms 的方法,所以我正在尝试 bookshelf 的原始包.

`TypeError:未捕获的错误:Driver.fetchAll 不是函数

server.js

'use strict';

const Hapi = require( 'hapi' );
const bodyParser = require( 'body-parser' );


const port = 9200;
const dbConfig = require( './config/config' );
const server = new Hapi.Server();

server.connection( {
    port: port,
    routes: {
        cors: true
    }
} );

var knex = require('knex')({
client: 'mysql',
connection: {
    "host": "127.0.0.1",
    "user": "user",
    "password": "pass",
    "database": "db"
}

});

server.bookshelf = require('bookshelf')(knex);

server.start( ( err ) =>{

    if( err ){
        throw err;
    }
    console.log( 'Server running on port ', port );
} );

module.exports = server;

require( './routes' );

models/driver.js

var bookshelf = require('../server').bookshelf;

module.exports = function (bookshelf) {

    var Driver = bookshelf.Model.extend({
        tableName: 'drivers'
    });

    return bookshelf.model('Driver', Driver);
};

controllers/drivers.js

'use strict';
var server = require( '../server' );
var bookshelf = server.bookshelf;
var Driver = require('../models/driver');

exports.index = server.route(
    {
        method: 'GET',
        path: '/drivers',
        config: {
            handler: function( request, reply ){
               Driver.fetchAll().then( function( drivers ){
                        reply( drivers );
                    } )
            }
        }
    }
);

您无法访问它,因为您的驱动程序模块正在返回一个函数。为了访问 Driver 对象,您必须调用 Driver 函数,如下所示:

var Driver = require('../models/driver')(bookshelf)

我建议您按以下方式更改模型,因为使用您使用的方法,每次您需要模块时都会初始化模型,这是错误的。

下面的设计最好只初始化一次。

var Bookshelf = require('../server').bookshelf;

var Driver = Bookshelf.Model.extend({
  tableName: 'drivers'
});

module.exports = Bookshelf.model('Driver', Driver);

并且在控制器中只需要如下所示。

var Driver = require('../models/driver')
Driver.fetchAll().then( function( drivers ){
  reply( drivers );
})