使用 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);
});