在 Node.js 中设置模型的正确方法
Correct way to set up models in Node.js
我正在构建一个小型 Node/Express 应用程序,并且我已经使用 postgresql 适配器设置了 Knex。一切正常。我知道它有效,因为我可以执行 sql 查询,结果就是我想要的 - 来自特定 table 的行。但我正在尝试建立模型,以便我可以引入相关数据并进行验证。我正在为此使用书架。
我的模型是这样设置的:
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 建议的那样。
我哪里错了?我猜这与没有正确设置书架或正确要求模型有关。
有什么建议吗?
此调用 fetchAll 未返回任何内容的一个原因可能是因为数据库查询是异步的。如果您稍后尝试在代码中使用变量 meals,它可能仍未定义。您应该将需要此集合的其余代码放在 .then 回调中,或放在新的 .then 回调中,以便它 运行 可以访问查询的数据。
我正在构建一个小型 Node/Express 应用程序,并且我已经使用 postgresql 适配器设置了 Knex。一切正常。我知道它有效,因为我可以执行 sql 查询,结果就是我想要的 - 来自特定 table 的行。但我正在尝试建立模型,以便我可以引入相关数据并进行验证。我正在为此使用书架。
我的模型是这样设置的:
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 建议的那样。
我哪里错了?我猜这与没有正确设置书架或正确要求模型有关。
有什么建议吗?
此调用 fetchAll 未返回任何内容的一个原因可能是因为数据库查询是异步的。如果您稍后尝试在代码中使用变量 meals,它可能仍未定义。您应该将需要此集合的其余代码放在 .then 回调中,或放在新的 .then 回调中,以便它 运行 可以访问查询的数据。