I have two models (Individual, Email) and am trying to insert into the created 'Individual_Email' table using the Sequelize commands. While Sequelize is creating the desired table, it returns the following error when trying to add/get/set to/from that table: "Object [object Promise] has no method 'addEmail'". What am I missing?
The Sequelize documentation says if the models are User and Project, "This will add methods getUsers, setUsers, addUsers to Project, and getProjects, setProjects and addProject to User."
This leads me to believe (looking at promises) that I'm likely misunderstanding how to use the asynchronous features of Node. I've tried both a synchronous and async version of insertion, both returning the same message above.
Sequelize Documentation: http://docs.sequelizejs.com/en/latest/docs/associations/
Code:
routes/index.js
var express = require('express');
var router = express.Router();
var models = require('../models');
/* GET home page. */
router.get('/', function(req, res, next) {
'use strict';
var tIndividual, tEmail;
tIndividual = models.Individual.create({
name: "Test"
});
tEmail = models.Email.create({
address: "[email protected]"
});
console.log(tEmail);
res.render('index', { title: 'Express' });
});
module.exports = router;
OR
/* GET home page. */
router.get('/', function(req, res, next) {
'use strict';
var tIndividual, tEmail;
tIndividual = models.Individual.create({
name: "Test"
}).then(function(){
tEmail = models.Email.create({
address: "[email protected]"
}).then(function(){
tIndividual.addEmail(tEmail).then(function(){
console.log("Success");
});
})
});
res.render('index', { title: 'Express' });
});
module.exports = router;
models/index.js
db.Individual.hasMany(db.Email, {
as: 'Email',
through: 'Individual_Email'
});
db.Email.hasMany(db.Individual, {
as: 'Individual',
through: 'Individual_Email'
});
How can I add to the table 'Individual_Email' in the best way? I'm assuming I need to do it synchronously to wait for the update, but I'm open to any suggestions. Thanks!
exports = db; belongsToMany() provides simple way to define the Sequelize Many-to-Many relationship. By passing "tutorial_tag" to through above, Sequelize will automatically generate a model named tutorial_tag as the through table (junction table), with two columns: tag_id and tutorial_id.
To create a One-To-One relationship, the hasOne and belongsTo associations are used together; To create a One-To-Many relationship, the hasMany and belongsTo associations are used together; To create a Many-To-Many relationship, two belongsToMany calls are used together.
When you call .save()
or .create()
or other methods that return a Promise, you should call .then()
on that promise. When it resolves -- that is, when the object gets saved/created/something-elsed -- your then
function will be called, and will receive the saved/created object as a parameter.
So your first attempt could be rewritten as:
models.Individual.create({
name: "Test"
}).then(function(createdIndividual) { // note the argument
models.Email.create({
address: "[email protected]"
}).then(function(createdEmail) { // note the argument
createdIndividual.addEmail(createdEmail)
.then(function(addedEmail) { // note th-- well you get the idea :)
console.log("Success");
});
})
});
The above code lacks a few important things, such as return
ing the promises for better chaining and error handling, but it's a start. I'd recommend Bluebird's documentation on the matter (that's the Promise library that Sequelize uses, but there are several others)
You can mitigate the "Pyramid of Doom" using promises of the best way:
var createdIndividual;
models.Individual.create({
name: "Test"
}).then(function(createdIn) { // note the argument
createdIndividual = createdIn;
return models.Email.create({
address: "[email protected]"
});
}).then(function(createdEmail) { // note the argument
return createdIndividual.addEmail(createdEmail);
}).then(function(addedEmail) { // note th-- well you get the idea :)
console.log("Success");
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With