很多很多自我参考在sequelize在twitter像web应用程序

我试图build立一个博客networking应用程序作为练习,特别是了解ORM和Sequelize。 我很容易pipe理post和评论以及用户和post之间的关系。 那里没有问题。 当我尝试将用户作为关注者和用户关联到用户时,恐怖就开始了。 我也希望它有可能跟随你自己。

我曾尝试过这样的事情:

const User = sequelize.define('user', { firstName: { type: Sequelize.STRING }, lastName: { type: Sequelize.STRING }, email: { type: Sequelize.STRING }, password: { type: Sequelize.STRING }, activated: { type: Sequelize.BOOLEAN } }) User.belongsToMany(User, {as: "Follower", foreignKey: "FollowerId", through: "Follower_Followeds"}) User.belongsToMany(User, {as: "Followed", foreignKey: "FollowedId", through: "Follower_Followeds"}) 

并设置关系:

 app.post("/followhandler", function(req, res) { let userId = req.session.userId let followId = req.body.followId User.findById(userId) .then( currentUser => { User.findById(followId) .then( follows => { currentUser.addUser(follows) }) }) .catch(e => console.log(e)) }) 

但是Follower_Followeds表将不会被更新。 我也尝试通过创build一个单独的表格并手动添加关系来跳过Sequelize的多对多的实现:

 const FollowerFollowed = sequelize.define('followerFollowed', { followedId: { type: Sequelize.INTEGER }, followerId: { type: Sequelize.INTEGER } }) //define Users const User = sequelize.define('user', { firstName: { type: Sequelize.STRING }, lastName: { type: Sequelize.STRING }, email: { type: Sequelize.STRING }, password: { type: Sequelize.STRING }, activated: { type: Sequelize.BOOLEAN } }) 

处理程序:

 app.post("/followhandler", function(req, res) { let userId = req.session.userId let followId = req.body.followId FollowerFollowed.create( { followerId: userId, followedId: followId }) .then( rel => console.log(rel)) .catch(e => console.log(e)) }) 

但在这种情况下,我收到以下错误:

TypeError:val.replace不是Object.SqlString.escape函数(/home/piepongwong/Documents/NYCDA/blog/node_modules/sequelize/lib/sql-string.js:61:15)在Object.escape(/ home /piepongwong/Documents/NYCDA/blog/node_modules/sequelize/lib/dialects/abstract/query-generator.js:978:22)在Object.insertQuery(/ home / piepongwong / Documents / NYCDA / blog / node_modules / sequelize / lib /dialects/abstract/query-generator.js:299:28)在QueryInterface.insert(/home/piepongwong/Documents/NYCDA/blog/node_modules/sequelize/lib/query-interface.js:497:33)at。 (/home/piepongwong/Documents/NYCDA/blog/node_modules/sequelize/lib/instance.js:679:56)at tryCatcher(/ home / piepongwong / Documents / NYCDA / blog / node_modules / bluebird / js / release / util。 js:16:23)at Promise._settlePromiseFromHandler(/home/piepongwong/Documents/NYCDA/blog/node_modules/bluebird/js/release/promise.js:510:31)at Promise._settlePromise(/ home / piepongwong / Documents / NYCDA / blog / node_modules / bluebird / js / release / promise.js:567:18)at Promise._settlePromise0(/home/piepongwong/Documents/NYCDA/blog/node_modules/bluebird/js/release/promise.js:612: 10)at Promise._settlePromises(/home/piepongwong/Documents/NYCDA/blog/node_modules/bluebird/js/release/promise.js:691:18)at Async._drainQueue(/ home / piepongwong / Documents / NYCDA / blog /立即在Async._drainQueues(/home/piepongwong/Documents/NYCDA/blog/node_modules/bluebird/js/release/async.js:143:10)节点模块/ bluebird / js / release / async.js:133:16) .Async.drainQueues(/ home / piepongwong / Documents / NYCDA / blog / node_modules / bluebird / js / release 在processImmediate(as_immediateCallback)(timers.js:594:5)处的tryOnImmediate(timers.js:622:5)处,在runCallback(timers.js:649:20)处的/async.js:17:14)TypeError:val。 Object.escape(/ home / piepongwong / Documents)中的Object.SqlString.escape(/home/piepongwong/Documents/NYCDA/blog/node_modules/sequelize/lib/sql-string.js:61:15)replace不是函数/NYCDA/blog/node_modules/sequelize/lib/dialects/abstract/query-generator.js:978:22)在Object.insertQuery(/ home / piepongwong / Documents / NYCDA / blog / node_modules / sequelize / lib / dialects / abstract /query-generator.js:299:28)在QueryInterface.insert(/home/piepongwong/Documents/NYCDA/blog/node_modules/sequelize/lib/query-interface.js:497:33)at。 (/home/piepongwong/Documents/NYCDA/blog/node_modules/sequelize/lib/instance.js:679:56)at tryCatcher(/ home / piepongwong / Documents / NYCDA / blog / node_modules / bluebird / js / release / util。 js:16:23)at Promise._settlePromiseFromHandler(/home/piepongwong/Documents/NYCDA/blog/node_modules/bluebird/js/release/promise.js:510:31)at Promise._settlePromise(/ home / piepongwong / Documents / NYCDA / blog / node_modules / bluebird / js / release / promise.js:567:18)at Promise._settlePromise0(/home/piepongwong/Documents/NYCDA/blog/node_modules/bluebird/js/release/promise.js:612: 10)at Promise._settlePromises(/home/piepongwong/Documents/NYCDA/blog/node_modules/bluebird/js/release/promise.js:691:18)at Async._drainQueue(/ home / piepongwong / Documents / NYCDA / blog /立即在Async._drainQueues(/home/piepongwong/Documents/NYCDA/blog/node_modules/bluebird/js/release/async.js:143:10)节点模块/ bluebird / js / release / async.js:133:16) .Async.drainQueues(/ home / piepongwong / Documents / NYCDA / blog / node_modules / bluebird / js / release 在processImmediate [as_immediateCallback](timers.js:594:5)处的tryOnImmediate(timers.js:622:5)处的runCallback(timers.js:649:20)处/async.js:17:14)

当您创buildM:M关联时,您将使用as: 'Follower'as: 'Followed'属性。 它影响您​​可以添加/设置/删除用户之间关联的方式。 将随后的用户添加到其他用户的方法现在称为addFollowed ,将以与您所做的完全相同的方式使用。

 User.findById(userId).then( currentUser => { User.findById(followId).then( follows => { currentUser.addFollowed(follows); // notice the difference here }); }); 

同样的情况发生,如果你想添加追随者给予用户 – 那么你会使用addFollower方法。

而且,在第二种解决scheme中,您在创build关联模型时犯了一个错误。 在User模型中,您已经通过外键FollowerIdFollowedId定义了关联,但是在FollowerFolloweds定义中,您已经创build了followerIdfollowedId ,所以这两者不匹配 – 您需要保持名称一致。

编辑

根据belongsToMany关系中的文档, as属性应该被命名为复数forms,所以在你的情况下,你应该把它们命名as: 'Followers'并且as: 'Followeds' (第二个似乎有点奇怪)。 Sequelize单独化这些值本身,但是你可以自己使用object来定义它as: { singular: 'Follower', plural: 'Followers' }

这个关联的别名。 如果你提供了一个string,它应该是复数forms ,并且将使用node.inflection单独化 。 如果你想自己控制单数版本,提供一个复数单数键的对象。