节点JS +异议JS + PostgreSQL。类型'{令牌:字符串}'的参数不能分配给类型'PartialUpdate <user>'的参数

时间:2019-02-15 08:42:47

标签: node.js postgresql typescript knex.js objection.js

环境:

  1. 节点js
  2. ES6
  3. knex:^ 0.16.3
  4. 异议:^ 1.5.3
  5. pg:^ 7.8.0 〜PostgreSQL

问题:

我无法更新数据库中的用户令牌。我从打字稿中收到一条错误消息。

打字稿错误消息:

  

'{token类型:字符串; }'不可分配给参数   类型为“ PartialUpdate <用户>”。对象文字只能指定已知   属性,并且“令牌”在“ PartialUpdate <用户>”类型中不存在。

问题方法

如果我写@ts-ignore,该方法可以工作,但我听不懂。

为什么给我一个错误?

import { User } from '@database/models';

...
const setToken = async (id: any, token: string) => {
  try {
    await transaction(User.knex(), trx =>
      User.query(trx)
      // An error appears on this line
        .update({ token })
        .where({ id }),
    );
  } catch (e) {
    throw e;
  }
};

我的用户模型

'use strict';

import { Model } from 'objection';

export default class User extends Model {
  static get tableName() {
    return 'users';
  }

  static get jsonSchema() {
    return {
      type: 'object',

      properties: {
        id: { type: 'uuid' },
        full_name: { type: 'string', minLength: 1, maxLength: 255 },
        email: { type: 'string', minLength: 1, maxLength: 255 },
        avatar: { type: 'string' },
        provider_data: {
          type: 'object',
          properties: {
            uid: { type: 'string' },
            provider: { type: 'string' },
          },
        },
        token: { type: 'string' },
        created_at: { type: 'timestamp' },
        updated_at: { type: 'timestamp' },
      },
    };
  }
}

2 个答案:

答案 0 :(得分:0)

**请提供带有变量partialUpdate的代码。因为错误的变量partialUpdate类型的声明引起错误。 TypeScript完全专注于变量类型,如果变量的类型与您提供给该变量类型的内容不匹配,则会生成错误。您正在将对象类型值{token:string}传递给您的变量partialUpdate,该变量只能在声明它时保留字符串类型的变量。 **

PartialUpdate:Object

PartialUpdate = {}

将解决问题。

答案 1 :(得分:0)

问题是我没有在模型中定义变量的类型。官方图书馆提供的示例让我知道我做错了什么-https://github.com/Vincit/objection.js/tree/master/examples/express-ts

更新的模型

export default class User extends Model {
  readonly id!: v4;
  full_name?: string;
  email?: string;
  avatar?: string;
  provider_data?: {
    uid: string;
    provider: string;
  };
  token?: string;

  static tableName = 'users';

  static jsonSchema = {
    type: 'object',

    properties: {
      id: { type: 'uuid' },
      full_name: { type: 'string', minLength: 1, maxLength: 255 },
      email: { type: 'string', minLength: 1, maxLength: 255 },
      avatar: { type: 'string' },
      provider_data: {
        type: 'object',
        properties: {
          uid: { type: 'string' },
          provider: { type: 'string' },
        },
      },
      token: { type: 'string' },
      created_at: { type: 'timestamp' },
      updated_at: { type: 'timestamp' },
    },
  };
}

更新的方法

const setToken = async (id: any, token: string) => {
  try {
    User.query()
      .update({ token })
      .where({ id });
  } catch (e) {
    throw e;
  }
};