Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.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/7/sqlite/3.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
Javascript 在承诺处理的插入/创建上续写外键约束_Javascript_Sqlite_Promise_Sequelize.js - Fatal编程技术网

Javascript 在承诺处理的插入/创建上续写外键约束

Javascript 在承诺处理的插入/创建上续写外键约束,javascript,sqlite,promise,sequelize.js,Javascript,Sqlite,Promise,Sequelize.js,我将以下DB模型与sequelize一起使用,并尝试向给定链接插入多个标记: const Tag = hnd.define('tag', { name: { type: Sequelize.STRING, allowNull: false, primaryKey: true, }, }); const Link = hnd.define('link', { title: { type: Sequelize.

我将以下DB模型与sequelize一起使用,并尝试向给定链接插入多个标记:

const Tag = hnd.define('tag', {
    name: {
        type: Sequelize.STRING,
        allowNull: false,
        primaryKey: true,
    },
});

const Link = hnd.define('link', {
    title: {
        type: Sequelize.STRING,
        allowNull: false,
    },
    description: {
        type: Sequelize.STRING,
        allowNull: false,
    },
    url: {
        type: Sequelize.STRING,
        allowNull: false,
    },
    votes: {
        type: Sequelize.INTEGER,
        allowNull: false,
    },
});

Link.belongsToMany(Tag, {through:'link_tag', foreignKey: 'tag_name'});
Tag.belongsToMany(Link, {through:'link_tag', foreignKey: 'link_id'});
为了处理这种情况,我愿意创建相应的链接、标签,然后填充n:m

Sequelize.transaction(function (t) {
    return Link.create({
        title: data.title,
        description: data.description,
        url: data.url,
        votes: 0,
    }, { transaction: t }).then(persistetLink => {
        return Sequelize.Promise.map(req.body.tags, function (tag) {
            return Tag.findOrCreate({ where: { name: tag.text }, transaction: t }).then(function (persistedTag) {
                return persistetLink.addTag(persistedTag, { transaction: t });
            });
        });
    });
当查看DB输出时,我面临一个
未处理的拒绝SequelizeForeignKeyConstraint错误:SQLITE\u约束:外键约束失败

因为在填充
link\u标记
关系之前不会插入链接

有没有关于如何处理这种情况的提示

日志输出为:

2017-09-16T09:37:04.554Z - info: Connection has been established successfully.
Executing (default): PRAGMA INDEX_INFO(`sqlite_autoindex_tags_1`)
Executing (default): CREATE TABLE IF NOT EXISTS `links` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `title` VARCHAR(255) NOT NULL, `description` VARCHAR(255) NOT NULL, `url` VARCHAR(255) NOT NULL, `votes` INTEGER NOT NULL, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL);
Executing (default): PRAGMA INDEX_LIST(`links`)
Executing (default): CREATE TABLE IF NOT EXISTS `link_tag` (`createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `tag_name` INTEGER NOT NULL REFERENCES `links` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, `link_id` VARCHAR(255) NOT NULL REFERENCES `tags` (`name`) ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY (`tag_name`, `link_id`));
Executing (default): PRAGMA INDEX_LIST(`link_tag`)
Executing (default): PRAGMA INDEX_INFO(`sqlite_autoindex_link_tag_1`)
Executing (152f0ee9-43ae-40e2-bf2d-0ee3d002b80e): BEGIN DEFERRED TRANSACTION;
Executing (152f0ee9-43ae-40e2-bf2d-0ee3d002b80e): INSERT INTO `links` (`id`,`title`,`description`,`url`,`votes`,`createdAt`,`updatedAt`) VALUES (NULL,'Heise','IT News','http://www.heise.de',0,'2017-09-16 09:37:13.250 +00:00','2017-09-16 09:37:13.250 +00:00');
Executing (152f0ee9-43ae-40e2-bf2d-0ee3d002b80e): COMMIT;
Executing (07ff716e-c00d-47c9-b54f-2af91bf58f32): BEGIN DEFERRED TRANSACTION;
Executing (07ff716e-c00d-47c9-b54f-2af91bf58f32): SAVEPOINT `07ff716e-c00d-47c9-b54f-2af91bf58f32-savepoint-1`;
Executing (07ff716e-c00d-47c9-b54f-2af91bf58f32): SAVEPOINT `07ff716e-c00d-47c9-b54f-2af91bf58f32-savepoint-2`;
Executing (07ff716e-c00d-47c9-b54f-2af91bf58f32): SAVEPOINT `07ff716e-c00d-47c9-b54f-2af91bf58f32-savepoint-3`;
Executing (07ff716e-c00d-47c9-b54f-2af91bf58f32): SELECT `name`, `createdAt`, `updatedAt` FROM `tags` AS `tag` WHERE `tag`.`name` = 'it';
Executing (07ff716e-c00d-47c9-b54f-2af91bf58f32): SELECT `name`, `createdAt`, `updatedAt` FROM `tags` AS `tag` WHERE `tag`.`name` = 'news';
Executing (07ff716e-c00d-47c9-b54f-2af91bf58f32): SELECT `name`, `createdAt`, `updatedAt` FROM `tags` AS `tag` WHERE `tag`.`name` = 'heise2';
Executing (07ff716e-c00d-47c9-b54f-2af91bf58f32): INSERT INTO `tags` (`name`,`createdAt`,`updatedAt`) VALUES ('it','2017-09-16 09:37:13.287 +00:00','2017-09-16 09:37:13.287 +00:00');
Executing (07ff716e-c00d-47c9-b54f-2af91bf58f32): INSERT INTO `tags` (`name`,`createdAt`,`updatedAt`) VALUES ('heise2','2017-09-16 09:37:13.287 +00:00','2017-09-16 09:37:13.287 +00:00');
Executing (07ff716e-c00d-47c9-b54f-2af91bf58f32): INSERT INTO `tags` (`name`,`createdAt`,`updatedAt`) VALUES ('news','2017-09-16 09:37:13.291 +00:00','2017-09-16 09:37:13.291 +00:00');
Executing (07ff716e-c00d-47c9-b54f-2af91bf58f32): SELECT `createdAt`, `updatedAt`, `tag_name`, `link_id` FROM `link_tag` AS `link_tag` WHERE `link_tag`.`tag_name` = 1 AND `link_tag`.`link_id` IN ('it', 1);
Executing (07ff716e-c00d-47c9-b54f-2af91bf58f32): SELECT `createdAt`, `updatedAt`, `tag_name`, `link_id` FROM `link_tag` AS `link_tag` WHERE `link_tag`.`tag_name` = 1 AND `link_tag`.`link_id` IN ('heise2', 1);
Executing (07ff716e-c00d-47c9-b54f-2af91bf58f32): SELECT `createdAt`, `updatedAt`, `tag_name`, `link_id` FROM `link_tag` AS `link_tag` WHERE `link_tag`.`tag_name` = 1 AND `link_tag`.`link_id` IN ('news', 1);
Executing (07ff716e-c00d-47c9-b54f-2af91bf58f32): INSERT INTO `link_tag` (`createdAt`,`updatedAt`,`tag_name`,`link_id`) VALUES ('2017-09-16 09:37:13.304 +00:00','2017-09-16 09:37:13.304 +00:00',1,'it'),('2017-09-16 09:37:13.304 +00:00','2017-09-16 09:37:13.304 +00:00',1,1);
Executing (07ff716e-c00d-47c9-b54f-2af91bf58f32): INSERT INTO `link_tag` (`createdAt`,`updatedAt`,`tag_name`,`link_id`) VALUES ('2017-09-16 09:37:13.305 +00:00','2017-09-16 09:37:13.305 +00:00',1,'heise2'),('2017-09-16 09:37:13.305 +00:00','2017-09-16 09:37:13.305 +00:00',1,1);
Executing (07ff716e-c00d-47c9-b54f-2af91bf58f32): INSERT INTO `link_tag` (`createdAt`,`updatedAt`,`tag_name`,`link_id`) VALUES ('2017-09-16 09:37:13.310 +00:00','2017-09-16 09:37:13.310 +00:00',1,'news'),('2017-09-16 09:37:13.310 +00:00','2017-09-16 09:37:13.310 +00:00',1,1);
Executing (07ff716e-c00d-47c9-b54f-2af91bf58f32): ROLLBACK;
Unhandled rejection SequelizeForeignKeyConstraintError: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed
    at Query.formatError (C:\DEV\git\linklist\node_modules\sequelize\lib\dialects\sqlite\query.js:374:18)
    at Statement.afterExecute (C:\DEV\git\linklist\node_modules\sequelize\lib\dialects\sqlite\query.js:119:32)
    at Statement.replacement (C:\DEV\git\linklist\node_modules\sqlite3\lib\trace.js:19:31)

我刚刚对你的代码做了一个快速的大脑编译。。。根据我以前使用这个漂亮框架的经验,最好先执行Promise.map/all调用,然后执行单个promises

因此,它可能只是基本上重新排列插入:

Sequelize.transaction(function(t) {
    return Sequelize.Promise.map(req.body.tags, function (tag) {
        return Tag.findOrCreate({ where: { name: tag.text }, transaction: t });
    }).then(function(values) {
        return Link.create({
            title: data.title,
            description: data.description,
            url: data.url,
            votes: 0,
        }, { transaction: t }).then(function(link) {
            return Sequelize.Promise.map(values, function(value) {
                return link.addTag(value[0], { transaction: t });
            });
        });
    });
});

请不要说我没有一个真正的解释为什么会这样。我使用回答功能来显示工作解决方案

嗯,我刚刚对你的代码进行了快速的大脑编译。。。根据我以前使用这个漂亮框架的经验,最好先执行Promise.map/all调用,然后执行单个promises

因此,它可能只是基本上重新排列插入:

Sequelize.transaction(function(t) {
    return Sequelize.Promise.map(req.body.tags, function (tag) {
        return Tag.findOrCreate({ where: { name: tag.text }, transaction: t });
    }).then(function(values) {
        return Link.create({
            title: data.title,
            description: data.description,
            url: data.url,
            votes: 0,
        }, { transaction: t }).then(function(link) {
            return Sequelize.Promise.map(values, function(value) {
                return link.addTag(value[0], { transaction: t });
            });
        });
    });
});
请不要说我没有一个真正的解释为什么会这样。我使用回答功能来显示工作解决方案