Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何对模型进行子类化并正确添加静态方法?_Node.js_Async Await_Sequelize.js - Fatal编程技术网

Node.js 如何对模型进行子类化并正确添加静态方法?

Node.js 如何对模型进行子类化并正确添加静态方法?,node.js,async-await,sequelize.js,Node.js,Async Await,Sequelize.js,我正在学习如何使用Sequelize作为小型web应用程序的ORM。(MySQL)数据库中的每条记录都有一个uuid字段。我想向所有模型添加一个findByUuid静态方法。以下是我的尝试: class Base extends Model { static findByUuid = async (uuid) => { return await super.findOne({ where: {uuid: uuid} }); } } class List e

我正在学习如何使用Sequelize作为小型web应用程序的ORM。(MySQL)数据库中的每条记录都有一个
uuid
字段。我想向所有模型添加一个
findByUuid
静态方法。以下是我的尝试:

class Base extends Model {
    static findByUuid = async (uuid) => {
        return await super.findOne({ where: {uuid: uuid} });
    }
}

class List extends Base {
}

List.init({
    uuid: {
        type: DataTypes.UUID,
        allowNull: false,
        defaultValue: Sequelize.UUIDV4
    },
    name: {
        type: DataTypes.STRING,
        allowNull: false
    }
}, {
    sequelize,
    nodelName: 'List',
    indexes: [
        { fields: ['name'] },
        { fields: ['uuid'] }
    ]
});

(async () => {
    await sequelize.sync({ force: true });
    const list = List.build({name: 'New List'});
    await list.save();
    console.log('id: ' + list.id);
    console.log('uuid: ' + list.uuid);
    const direct_retrieved = await List.findOne({ where: {uuid: list.uuid} });
    console.log('direct name: ' + direct_retrieved.name);
    const retrieved = await List.findByUuid(list.uuid);
    console.log('static retrieved: ' + retrieved.name);
})();
以下是输出(不包括回显的SQL命令):

id:1
uuid:371971dd-a4d9-43aa-ac10-afe3c10154b0
直接名称:新列表
/Users/chuck/Projects/app/node_modules/sequelize/lib/model.js:1692
this.warnOnInvalidOptions(选项,Object.keys(this.rawtattributes));
^
TypeError:无法将未定义或null转换为对象
在Function.keys()处
位于Function.findAll(/Users/chuck/Projects/app/node_modules/sequelize/lib/model.js:1692:47)
在Function.findOne(/Users/chuck/Projects/app/node_modules/sequelize/lib/model.js:1917:23)
位于Function.findByUuid(/Users/chuck/Projects/app/models/models.js:7:36)
在/Users/chuck/Projects/app/models/models.js:181:34
在处理和拒绝时(节点:内部/处理/任务队列:93:5)
因此,直接使用
findOne
是可行的,但是尝试在静态方法中这样做会导致错误,我一直无法找出原因


我认为问题在于
Base
类不知道
uuid
字段。如果我将静态方法放入
列表
类中,它将正常工作。因此,到目前为止,我唯一的解决方案是对每个实际的表重复该代码,因为我(还)没有看到在
Base
类中定义
uuid
字段的方法(无论如何,这是最好的。

事实证明,我需要重写
init
,让
Base
了解
uuid
字段。以下是有效的解决方案

const { Sequelize, DataTypes, Model } = require('sequelize');

const sequelize = require('./helpers/sequelize');

class Base extends Model {
    static findByUuid = async (uuid) => {
        return await super.findOne({ where: {uuid: uuid} });
    }

    static init = (attributes, options = {}) => {
        attributes.uuid = {
            type: DataTypes.UUID,
            allowNull: false,
            defaultValue: Sequelize.UUIDV4
        };
        options.indexes.push({ fields: ['uuid'] });
        super.init(attributes, options);
    }
}

class List extends Base {
}

List.init({
    name: {
        type: DataTypes.STRING,
        allowNull: false
    }
}, {
    sequelize,
    modelName: 'List',
    indexes: [
        { fields: ['name'] }
    ]
});



(async () => {
    await sequelize.sync({ force: true });
    const list = List.build({name: 'New List'});
    await list.save();
    console.log('id: ' + list.id);
    console.log('uuid: ' + list.uuid);
    const direct_retrieved = await List.findOne({ where: {uuid: list.uuid} });
    console.log('direct: ' + direct_retrieved.name);
    const retrieved = await List.findByUuid(list.uuid);
    console.log('static: ' + retrieved.name);
})();
const { Sequelize, DataTypes, Model } = require('sequelize');

const sequelize = require('./helpers/sequelize');

class Base extends Model {
    static findByUuid = async (uuid) => {
        return await super.findOne({ where: {uuid: uuid} });
    }

    static init = (attributes, options = {}) => {
        attributes.uuid = {
            type: DataTypes.UUID,
            allowNull: false,
            defaultValue: Sequelize.UUIDV4
        };
        options.indexes.push({ fields: ['uuid'] });
        super.init(attributes, options);
    }
}

class List extends Base {
}

List.init({
    name: {
        type: DataTypes.STRING,
        allowNull: false
    }
}, {
    sequelize,
    modelName: 'List',
    indexes: [
        { fields: ['name'] }
    ]
});



(async () => {
    await sequelize.sync({ force: true });
    const list = List.build({name: 'New List'});
    await list.save();
    console.log('id: ' + list.id);
    console.log('uuid: ' + list.uuid);
    const direct_retrieved = await List.findOne({ where: {uuid: list.uuid} });
    console.log('direct: ' + direct_retrieved.name);
    const retrieved = await List.findByUuid(list.uuid);
    console.log('static: ' + retrieved.name);
})();