2015-12-21 2 views
1

Я создаю небольшое приложение Node/Express, и я установил Knex с адаптером postgresql. Это все работает. Я знаю, что это работает, потому что я могу выполнить sql-запрос, и результаты - это то, что я хочу - строки из конкретной таблицы. Но я пытаюсь настроить модели, чтобы я мог приносить связанные данные и выполнять проверки. Для этого я использую книжную полку.Правильный способ настройки моделей в Node.js

Я настроил мои модели, как это:

base.js

var knex = require('../../config/db'); 
var bookshelf = require('bookshelf')(knex); 
bookshelf.plugin('registry'); 

module.exports = bookshelf; 

food.js

var bookshelf = require('./base'); 
var Meal = require('./meal'); 

var Food = bookshelf.Model.extend({ 
    tableName: 'foods', 
    meal: function() { 
    return this.belongsTo(Meal); 
    } 
}); 

module.exports = bookshelf.model('Food', Food); 

meal.js

var bookshelf = require('./base'); 
var Day = require('./day'); 
var Food = require('./food'); 

var Meal = bookshelf.Model.extend({ 
    tableName: 'meals', 
    foods: function() { 
    return this.hasMany(Food); 
    }, 
    day: function() { 
    return this.belongsTo(Day); 
    } 
}); 

module.exports = bookshelf.model('Meal', Meal); 

day.js

var bookshelf = require('./base'); 
var Meal = require('./meal'); 

var Day = bookshelf.Model.extend({ 
    tableName: 'days', 
    meals: function() { 
    return this.hasMany(Meal); 
    } 
}); 

module.exports = bookshelf.model('Day', Day); 

Проблема заключается в том, что, когда мне нужна модель в маршрутизаторе, я получаю NotFoundError так:

model: 
    { [Function] 
    NotFoundError: [Function: ErrorCtor], 
    NoRowsUpdatedError: [Function: ErrorCtor], 
    NoRowsDeletedError: [Function: ErrorCtor] } 

Я пытаюсь получить результаты db выглядят следующим образом:

var Meal = require('../models/meal'); 

var meals = Meal.fetchAll().then(function(collection) { 
    return collection; 
}); 
... 

Почему это ничего не возвращает? Это похоже на то, что предлагает documentation.

Куда я иду не так? Я предполагаю, что это связано с неправильной настройкой книжной полки или правильной моделью.

Любые советы?

ответ

1

Одна из причин, по которой этот вызов fetchAll не возвращается, может быть вызвано тем, что запрос базы данных является асинхронным. Если вы пытаетесь использовать переменные блюда позже в своем коде, это, вероятно, все еще будет неопределенным. Вы должны поместить остальную часть своего кода, которая нуждается в этой коллекции внутри обратного вызова .then, или в новом обратном вызове .then, чтобы он работал с доступом к запрошенным данным.

+0

Таким образом, вам даже не нужно назначать переменные блюда для коллекций значений. Вы можете просто написать код в этом обратном вызове, а затем вместо возврата коллекции просто использовать его в своем коде, где вместо этого вы бы использовали переменную питания. – StackingKarma

+0

Хорошо, это имеет большой смысл. Я отредактировал код и получил другую ошибку: 'this._reset не является функцией'. Я считаю, что я каким-то образом экспортирую модель. Но обещание - это то, почему он не вернулся. Благодарю. – user3162553

+0

Возможно, вы получите эту ошибку, если ваш вход для сохранения() является моделью книжной полки, а не объектом –

Смежные вопросы