sequelize调用save和update方法出错

发布于 2022-09-05 22:56:01 字数 3656 浏览 30 评论 0

更新:2017-10-24 08:43:45 发现自己下面的方法不能根治bug。但有人回复了我在github上提的issuev3不在支持,用v4吧重装最新版的sequelize,还需装mysql2模块。
~世界从此清净了~
更新:2017-10-19 22:48:11 问题已解决。自己在下面自问自答。
从数据库中获取了一篇文章,要修改内容,但一直报错val.replace is not a function
补充:article的模型 后来改了映射 contents: content

var DB = require('../db.js');
var Sequelize = require('sequelize');

module.exports = DB.define('article',{
    id: {
        type: Sequelize.INTEGER,
        field: 'id',
        unique: true,
        primaryKey: true,
        allowNull: false,
        autoIncrement: true
    },
    title: {
        type: Sequelize.STRING(100),
        field: 'title',
        defaultValue: ''
    },
    cateid: {
        type: Sequelize.INTEGER,
        field: 'cateid',
        allowNull: false
    },
    time: {
        type: Sequelize.DATE,
        field: 'time',
        defaultValue: Sequelize.NOW
    },
    clicks: {
        type: Sequelize.INTEGER(11),
        field: 'click',
        defaultValue: 0
    },
    contents: {
        type: Sequelize.TEXT,
        field: 'content',
        defaultValue: ''
    },
    hide: {
        type: Sequelize.BOOLEAN,
        field: 'hide',
        defaultValue: false
    },
    tags: {
        type: Sequelize.TEXT,
        field: 'tags',
        defaultValue: ''
    }
}, {
    tableName: 'think_article',
    timestamps: false,      //是否自动添加时间戳
    freezeTableName: true // Model 对应的表名将与model名相同
});

数据库设计
图片描述

var Article = require('../../orm/models/article');
var ArticleBLL = require('../../orm/BLL/Article');
...
var p = await ArticleBLL.GetById(id);
try {
    //方法一
    //await p.update({ content: 'wori' });
    
    //方法二
    await Article.update({ content: htmlTree.Root.innerHTML }, { where: { id: p.id } });
    
    //方法三
    //p.content = htmlTree.Root.innerHTML;
    //await p.save();

    res.redirect('/article/detail/' + id);
} catch (e) {
    //一直是这个:val.replace is not a function
    console.log(e.message);
    res.render('home/404');
}

补充:调试了一下,发现在sql-string.js文件中val由传入的'123'变成了一个函数~~
图片描述

图片描述

图片描述

补充调试:
修改数据的语句
图片描述
2017-9-2 23:24:08

发现是instance.js 846行 save方法里出错了

2017-9-2 23:29:17

发现是instance.js 573行 Promise.bind出错了

2017-9-2 23:37:38

promise.js 496行 receiver 内容没问题 难道是contents字段字太多? 
promise.js 524行 回滚了 promise._resolveCallback 
走错路了

2017-9-2 23:51:04
图片描述

query-generator.js 474行 及开始调用escape了 断点要打在这里!
    465行key是content?为什么 content = 'wori'??? 我曹数据库确实是
    但还有一个type键 为什么?
找到了escape的位置 query-generator.js 946行 注释明明说 Escape a value (e.g. a string, number or date) 

图片描述

执行到 978行 调用了SqlString.escape 划重点!
最终跳到了 sql-string.js的 val.replace中 然后出错

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

極樂鬼 2022-09-12 22:56:01

今天(2017-09-21)发现,BLL文件中单独测试修改保存,竟然没问题。BLL文件引入到其他文件中就报错了。
2017-10-19 22:45:26 问题解决了。
修改源文件node_modules_sequelize@3.30.4@sequelizelibdialectsabstractquery-generator.js
第473行中的value可能是function 此时key是'type'。
在后面加一句if(typeof value == 'function') continue;

回忆凄美了谁 2022-09-12 22:56:01

既然 val 变成了一个函数,那你要找到给 val 赋值的地方来分析,是哪里把它变成了一个函数。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文