2017-03-04 5 views
1

私はORMとSequelizeを理解するための練習としてブログWebアプリケーションを構築しようとしています。私は、投稿、コメント、ユーザーと投稿の間に関係を形成するのは非常に簡単でした。そこに問題はありません。フォロワーはユーザーをフォロワーとして、ユーザーをユーザーにリンクさせようとすると、フォローが始まります。私はまた、あなた自身に従うことが可能であることを望んでいます。web-appのようなtwitterでSequelizeの多対多自己参照

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テーブルは、単純に更新されません。

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 
    } 
    }) 

ハンドラ: 私はまた、別のテーブルを作成し、手動で関係を追加することでSequelizeの多くの実装に多くをスキップしようとした

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 is not a function at Object.SqlString.escape (/home/piepongwong/Documents/NYCDA/blog/node_modules/sequelize/lib/sql-string.js:61:15) at Object.escape (/home/piepongwong/Documents/NYCDA/blog/node_modules/sequelize/lib/dialects/abstract/query-generator.js:978:22) at Object.insertQuery (/home/piepongwong/Documents/NYCDA/blog/node_modules/sequelize/lib/dialects/abstract/query-generator.js:299:28) at 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/node_modules/bluebird/js/release/async.js:133:16) at Async._drainQueues (/home/piepongwong/Documents/NYCDA/blog/node_modules/bluebird/js/release/async.js:143:10) at Immediate.Async.drainQueues (/home/piepongwong/Documents/NYCDA/blog/node_modules/bluebird/js/release/async.js:17:14) at runCallback (timers.js:649:20) at tryOnImmediate (timers.js:622:5) at processImmediate [as _immediateCallback] (timers.js:594:5) TypeError: val.replace is not a function at Object.SqlString.escape (/home/piepongwong/Documents/NYCDA/blog/node_modules/sequelize/lib/sql-string.js:61:15) at Object.escape (/home/piepongwong/Documents/NYCDA/blog/node_modules/sequelize/lib/dialects/abstract/query-generator.js:978:22) at Object.insertQuery (/home/piepongwong/Documents/NYCDA/blog/node_modules/sequelize/lib/dialects/abstract/query-generator.js:299:28) at 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/node_modules/bluebird/js/release/async.js:133:16) at Async._drainQueues (/home/piepongwong/Documents/NYCDA/blog/node_modules/bluebird/js/release/async.js:143:10) at Immediate.Async.drainQueues (/home/piepongwong/Documents/NYCDA/blog/node_modules/bluebird/js/release/async.js:17:14) at runCallback (timers.js:649:20) at tryOnImmediate (timers.js:622:5) at processImmediate [as _immediateCallback] (timers.js:594:5)

答えて

1

あなたはMを作成する場合:M協会は、あなたがas: 'Follower'as: 'Followed'属性を使用しますs。これは、ユーザー間の関連付けを追加/設定/削除する方法に影響します。追跡されたユーザーを他のユーザーに追加する方法は今やaddFollowedと呼ばれ、まったく同じ方法で使用されます。その後、あなたはaddFollowerメソッドを使用します -

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

同じことは、あなたが与えられたユーザにフォロワーを追加する場合に発生します。

さらに、2番目のソリューションでは、関連するモデルを作成する際に間違いがあります。 Userモデルでは、外部キーFollowerIdFollowedIdを使用して関連付けを定義していますが、FollowerFolloweds定義ではfollowerIdfollowedIdを作成しているため、これらの2つは一致しません。あなたのケースでは、あなたがそれらのas: 'Followers'as: 'Followeds'を(1秒は少し奇妙に思える)名前を付ける必要がありますので、belongsToMany関係のドキュメントによると、as属性は、複数よう

EDIT

を命名する必要があります。 Sequelizeはそれらの値自体を特異化しますが、オブジェクトを使用して自分で定義することもできます。as: { singular: 'Follower', plural: 'Followers' }

The alias of this association. If you provide a string, it should be plural, and will be singularized using node.inflection. If you want to control the singular version yourself, provide an object with plural and singular keys.

関連する問題