使用 Knex 和 Objection.js 急切加载相关数据
Eager loading associated data with Knex and Objection.js
我有一个 Express api,使用 Postgresql 进行数据存储,Knex/Objection 进行查询和建模。
我有两个模型 Users 和 Posts s.t。用户 has_many Post 和 Post belongs_to 用户。
我正在尝试 return 将关联的用户对象关联到特定的 post,例如 post.user,但出现错误
这是我的异议模型:
基础模型:
</src/models/BaseModel.js>
const { Model } = require('objection');
class BaseModel extends Model {
$beforeInsert() {
const now = new Date().toISOString();
this.created_at = now;
this.updated_at = now;
}
$beforeUpdate() {
const now = new Date().toISOString();
this.updated_at = now;
}
}
module.exports = BaseModel;
用户模型:
<src/models/User.js>
const BaseModel = require("./BaseModel");
// const Password = require('objection-password')();
class User extends BaseModel {
static get tableName() {
return "users";
}
static get relationMappings () {
return {
posts: {
relation: Model.HasManyRelation,
modelClass: Post,
join: {
from: 'users.id',
to: 'posts.users_id'
}
}
}
}
}
module.exports = User;
和Post的型号:
</src/models/Post.js>
const BaseModel = require("./BaseModel");
const User = require('./User');
// const Password = require('objection-password')();
class Post extends BaseModel {
static get tableName() {
return "posts";
}
static get relationMappings () {
return {
user: {
relation: BaseModel.BelongsToOneRelation,
modelClass: User,
join: {
from: 'posts.users_id',
to: 'users.id'
}
}
}
}
}
module.exports = Post;
这是我的路线/查询:
const express = require('express');
const User = require('../models/User');
const Post = require('../models/Post');
let router = express.Router();
router.get('/', async (req, res) => {
const posts = await Post
.query().eager('users');
res.json(posts);
});
module.exports = router;
这是错误跟踪:
Running on localhost:8000
(node:32230) UnhandledPromiseRejectionWarning: ValidationError: unknown relation "users" 在急切的表达中
在 Function.createValidationError (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/model/Model.js:397:12)
在 findRelationsToFetch (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/operations/eager/WhereInEagerOperation.js:166:24)
在 WhereInEagerOperation.onBuild (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/operations/eager/WhereInEagerOperation.js:36:30)
在 QueryBuilder.callOperationMethod (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:345:33)
在 forEachOperation.op (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:437:14)
在 QueryBuilder.forEachOperation (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:282:37)
在 QueryBuilder.executeOnBuild (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:435:10)
在 callOnBuildHooks (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:1363:11)
在 doExecute (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:1253:13)
在 Bluebird.try.then (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:573:19)
来自之前的活动:
在 QueryBuilder.execute (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:573:8)
在 QueryBuilder.then (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:490:26)
在 process._tickCallback (internal/process/next_tick.js:68:7)
(节点:32230)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这个错误要么是在没有 catch 块的情况下在异步函数内部抛出,要么是因为拒绝了一个没有用 .catch() 处理的承诺。 (拒绝编号:2)
(节点:32230)[DEP0018] DeprecationWarning:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将以非零退出代码终止 Node.js 进程。
^[[1;2C(node:32230) UnhandledPromiseRejectionWarning: ValidationError: unknown relation "users" in an eager expression
在 Function.createValidationError (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/model/Model.js:397:12)
在 findRelationsToFetch (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/operations/eager/WhereInEagerOperation.js:166:24)
在 WhereInEagerOperation.onBuild (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/operations/eager/WhereInEagerOperation.js:36:30)
在 QueryBuilder.callOperationMethod (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:345:33)
在 forEachOperation.op (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:437:14)
在 QueryBuilder.forEachOperation (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:282:37)
在 QueryBuilder.executeOnBuild (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:435:10)
在 callOnBuildHooks (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:1363:11)
在 doExecute (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:1253:13)
在 Bluebird.try.then (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:573:19)
来自之前的活动:
在 QueryBuilder.execute (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:573:8)
在 QueryBuilder.then (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:490:26)
在 process._tickCallback (internal/process/next_tick.js:68:7)
(节点:32230)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这个错误要么是在没有 catch 块的情况下在异步函数内部抛出,要么是因为拒绝了一个没有用 .catch() 处理的承诺。 (拒绝编号:4)
好的解决了这个问题。
将路线查询更改为:
router.get('/', async (req, res) => {
const posts = await Post
.query().eager('user');
res.json(posts);
});
我有一个 Express api,使用 Postgresql 进行数据存储,Knex/Objection 进行查询和建模。
我有两个模型 Users 和 Posts s.t。用户 has_many Post 和 Post belongs_to 用户。
我正在尝试 return 将关联的用户对象关联到特定的 post,例如 post.user,但出现错误
这是我的异议模型:
基础模型:
</src/models/BaseModel.js>
const { Model } = require('objection');
class BaseModel extends Model {
$beforeInsert() {
const now = new Date().toISOString();
this.created_at = now;
this.updated_at = now;
}
$beforeUpdate() {
const now = new Date().toISOString();
this.updated_at = now;
}
}
module.exports = BaseModel;
用户模型:
<src/models/User.js>
const BaseModel = require("./BaseModel");
// const Password = require('objection-password')();
class User extends BaseModel {
static get tableName() {
return "users";
}
static get relationMappings () {
return {
posts: {
relation: Model.HasManyRelation,
modelClass: Post,
join: {
from: 'users.id',
to: 'posts.users_id'
}
}
}
}
}
module.exports = User;
和Post的型号:
</src/models/Post.js>
const BaseModel = require("./BaseModel");
const User = require('./User');
// const Password = require('objection-password')();
class Post extends BaseModel {
static get tableName() {
return "posts";
}
static get relationMappings () {
return {
user: {
relation: BaseModel.BelongsToOneRelation,
modelClass: User,
join: {
from: 'posts.users_id',
to: 'users.id'
}
}
}
}
}
module.exports = Post;
这是我的路线/查询:
const express = require('express');
const User = require('../models/User');
const Post = require('../models/Post');
let router = express.Router();
router.get('/', async (req, res) => {
const posts = await Post
.query().eager('users');
res.json(posts);
});
module.exports = router;
这是错误跟踪:
Running on localhost:8000
(node:32230) UnhandledPromiseRejectionWarning: ValidationError: unknown relation "users" 在急切的表达中 在 Function.createValidationError (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/model/Model.js:397:12) 在 findRelationsToFetch (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/operations/eager/WhereInEagerOperation.js:166:24) 在 WhereInEagerOperation.onBuild (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/operations/eager/WhereInEagerOperation.js:36:30) 在 QueryBuilder.callOperationMethod (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:345:33) 在 forEachOperation.op (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:437:14) 在 QueryBuilder.forEachOperation (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:282:37) 在 QueryBuilder.executeOnBuild (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:435:10) 在 callOnBuildHooks (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:1363:11) 在 doExecute (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:1253:13) 在 Bluebird.try.then (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:573:19) 来自之前的活动: 在 QueryBuilder.execute (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:573:8) 在 QueryBuilder.then (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:490:26) 在 process._tickCallback (internal/process/next_tick.js:68:7) (节点:32230)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这个错误要么是在没有 catch 块的情况下在异步函数内部抛出,要么是因为拒绝了一个没有用 .catch() 处理的承诺。 (拒绝编号:2) (节点:32230)[DEP0018] DeprecationWarning:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将以非零退出代码终止 Node.js 进程。 ^[[1;2C(node:32230) UnhandledPromiseRejectionWarning: ValidationError: unknown relation "users" in an eager expression 在 Function.createValidationError (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/model/Model.js:397:12) 在 findRelationsToFetch (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/operations/eager/WhereInEagerOperation.js:166:24) 在 WhereInEagerOperation.onBuild (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/operations/eager/WhereInEagerOperation.js:36:30) 在 QueryBuilder.callOperationMethod (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:345:33) 在 forEachOperation.op (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:437:14) 在 QueryBuilder.forEachOperation (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:282:37) 在 QueryBuilder.executeOnBuild (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:435:10) 在 callOnBuildHooks (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:1363:11) 在 doExecute (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:1253:13) 在 Bluebird.try.then (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:573:19) 来自之前的活动: 在 QueryBuilder.execute (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:573:8) 在 QueryBuilder.then (/Users/dariusgoore/development/writtr-app/writerboard-express-api/node_modules/objection/lib/queryBuilder/QueryBuilder.js:490:26) 在 process._tickCallback (internal/process/next_tick.js:68:7) (节点:32230)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这个错误要么是在没有 catch 块的情况下在异步函数内部抛出,要么是因为拒绝了一个没有用 .catch() 处理的承诺。 (拒绝编号:4)
好的解决了这个问题。
将路线查询更改为:
router.get('/', async (req, res) => {
const posts = await Post
.query().eager('user');
res.json(posts);
});