【问题标题】:Correct way to set up models in Node.js在 Node.js 中设置模型的正确方法
【发布时间】:2026-01-16 17:00:01
【问题描述】:

我正在构建一个小型 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 建议的内容。

我哪里错了?我猜这与没有正确设置书架或正确要求模型有关。

有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 因此您甚至不需要将变量餐分配给值集合。您可以在该回调中编写代码,而不是返回集合,只需在您的代码中使用它,而不是使用餐点变量。
    • 好的,这很有意义。我重构了代码并得到了一个不同的错误:this._reset is not a function。我相信我以某种方式错误地导出了模型。但承诺是它没有返回的原因。谢谢。
    • 如果您对 save() 的输入是书架模型而不是对象,您可能会收到此错误