在Node.js中设置模型的正确方法

时间:2015-12-21 23:28:55

标签: javascript node.js es6-promise bookshelf.js knex.js

我正在构建一个小型Node / Express应用程序,我已经使用postgresql适配器设置了Knex。这一切都有效。我知道它的工作原理是因为我可以进行SQL查询,结果就是我想要的 - 来自特定表的行。但我试图建立模型,以便我可以引入相关数据并进行验证。我正在使用书架。

我已经设置了这样的模型:

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] }

我试图像这样检索数据库结果:

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

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

为什么这不归还什么?这看起来像documentation所暗示的那样。

我哪里错了?我猜它与未正确设置书架或正确使用模型有关。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

此fetchAll调用未返回任何内容的一个原因可能是因为数据库查询是异步的。如果您稍后在代码中尝试使用可变餐,则可能仍未定义。您应该将需要此集合的其余代码放在.then回调中,或放在新的.then回调中,以便它可以访问查询的数据来运行。