node.js - Sequelize 对象未定义,但存在于之前的 then 语句中

标签 node.js express sequelize.js

我有一个问题,我试图访问一个对象,但由于某种原因,尽管在语句的前面创建了对象并且能够从单独的 then 语句中访问它,但由于某种原因它出现为 undefined

下面是对我的 post 方法逻辑的更好解释。在上一条到 /sign-up/organization 的路由上创建了一个用户。然后该用户创建一个组织,该组织在第一个 then 语句中在 member 表中创建用户和组织之间关系的记录。在创建该记录后,应立即使用创建的组织 ID 更新用户模型。

终端输出:

Executing (default): INSERT INTO `organization` (`organization_id`,`organization_name`,`admin`,`discovery_source`,`updatedAt`,`createdAt`) VALUES (DEFAULT,'Organization Test','test@testg.com','Nice','2016-01-17 19:07:21','2016-01-17 19:07:21'); 
Error at PostTypeError: Cannot read property 'organizationId' of undefined
Executing (default): INSERT INTO `member` (`member_id`,`member_email`,`organization_id`,`user_id`,`updatedAt`,`createdAt`) VALUES (DEFAULT,'tttest@testg.com',4,4,'2016-01-17 19:07:21','2016-01-17 19:07:21');
models.User.update 发生错误

路线:
var express = require('express');
var appRoutes   = express.Router();
var passport = require('passport');
var localStrategy = require('passport-local').Strategy;
var models = require('../models/db-index');


appRoutes.route('/sign-up/organization')

    .get(function(req, res){
        models.User.find({
            where: {
                user_id: req.user.email
            }, attributes: [ 'user_id', 'email'
            ]
        }).then(function(user){
            res.render('pages/app/sign-up-organization.hbs',{
                user: req.user
            });
        })  
    })

    .post(function(req, res, user){
        models.Organization.create({
            organizationName: req.body.organizationName,
            admin: req.body.admin,
            discoverySource: req.body.discoverySource
        }).then(function(organization, user){
            organization = organization;
            console.log(organization);
            models.Member.create({
                organizationId: organization.organizationId,
                memberEmail: req.user.email,
                userId: req.user.user_id
            },{ where: { user_id: req.user.user_id }});

        }).then(function(organization, user){
            models.User.update({
                organizationId: organization.organizationId
            });
            res.redirect('/app');
        }).catch(function(error){
            res.send(error);
            console.log('Error at Post' + error);
        })
    });



appRoutes.get('/logout', function(req, res){
    req.logout();
    console.log('User logged out');
    res.redirect('/');
});



module.exports = appRoutes;

页面/app/sign-up-organization.hbs:
<!DOCTYPE html>
<head>
    {{> head}}
</head>
<body>
    {{> navigation}}
    <div class="container">
        <div class="col-md-6 col-md-offset-3">
            <form action="/app/sign-up/organization" method="post">
                <p>{{user.email}}</p>
                <input type="hidden" name="admin" value="{{user.email}}">
                <input type="hidden" name="organizationId">
                <label for="sign-up-organization">Company/Organization Name</label>
                <input type="text" class="form-control" id="sign-up-organization"  name="organizationName" value="" placeholder="Company/Organization">
                <a href="#" id="sign-up-add-discovery-source">Add Another Discovery Source</a>
                <div id="sign-up-organization-discovery-source">
                    <input type="text" id="discovery-source-field" placeholder="Discovery Source" name="discoverySource">
                </div>
                <br />
                    <button type="submit">Submit</button>
            </form>
            <a href="/login">Already have an account? Login here!</a>
        </div>
    </div>
</body>

组织:
module.exports = function(sequelize, DataTypes) {


    var Organization = sequelize.define('organization', {
        organizationId: {
            type: DataTypes.INTEGER,
            field: 'organization_id',
            autoIncrement: true,
            primaryKey: true
        },
        organizationName: {
            type: DataTypes.STRING,
            field: 'organization_name'
        },
        admin: DataTypes.STRING,
        discoverySource: {
            type: DataTypes.STRING,
            field: 'discovery_source'
        },
        members: DataTypes.STRING
    },{
        freezeTableName: true,
        classMethods: {
            associate: function(db) {
                Organization.belongsToMany(db.User, { through: 'member', foreignKey: 'user_id' });
            },
        },
    });

        return Organization;
    }

用户:
var bcrypt   = require('bcrypt-nodejs');

module.exports = function(sequelize, DataTypes) {

var User = sequelize.define('user', {
    user_id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
    },
    firstName: {
        type: DataTypes.STRING,
        field: 'first_name'
    },
    lastName: {
        type: DataTypes.STRING,
        field: 'last_name'
    },
    email: {
        type: DataTypes.STRING,
        isEmail: true,
        unique: true
    },
    password: DataTypes.STRING,
    organizationId: {
        type: DataTypes.INTEGER,
        field: 'organization_id',
        allowNull: true
    }
}, {
    freezeTableName: true,
    classMethods: {
        associate: function(db) {
            User.belongsToMany(db.Organization, { through: 'member', foreignKey: 'organizationId'})
        },
        generateHash: function(password) {
            return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
        },
    },
    instanceMethods: {
        validPassword: function(password) {
            return bcrypt.compareSync(password, this.password);
        },
    },


});
    return User;
}

成员:
module.exports = function(sequelize, DataTypes) {

var Member = sequelize.define('member', {
    memberId: {
        type: DataTypes.INTEGER,
        field: 'member_id',
        autoIncrement: true,
        primaryKey: true
    },
    memberEmail: {
        type: DataTypes.STRING,
        field: 'member_email'
    },
    organizationId: {
        type: DataTypes.INTEGER,
        field: 'organization_id',
        allowNull: true
    },
    userId: {
        type: DataTypes.INTEGER,
        field: 'user_id',
        allowNull: true
    }
},{
    freezeTableName: true,
});

    return Member;
}

数据库索引:
var Sequelize = require('sequelize');
var path = require('path');
var config = require(path.resolve(__dirname, '..', '..','./config/config.js'));
var sequelize = new Sequelize(config.database, config.username, config.password, {
    host:'localhost',
    port:'3306',
    dialect: 'mysql'
});

sequelize.authenticate().then(function(err) {
    if (!!err) {
        console.log('Unable to connect to the database:', err)
    } else {
        console.log('Connection has been established successfully.')
    }
});

var db = {}

db.Member = sequelize.import(__dirname + "/member");

db.Organization = sequelize.import(__dirname + "/organization");

db.User = sequelize.import(__dirname + "/user");

db.Annotation = sequelize.import(__dirname + "/annotation");

db.User.associate(db);
db.Organization.associate(db);
db.Annotation.associate(db);

db.sequelize = sequelize;
db.Sequelize = Sequelize;

sequelize.sync();

module.exports = db;

最佳答案

要在另一个 then 语句中使用从 then 语句中获取的 Promise 对象,您需要返回 Promise 对象。

您需要返回在 organization 方法的第一个 'then' 调用中获得的 post 对象:

...
.post(function(req, res, user){
    models.Organization.create({
        organizationName: req.body.organizationName,
        admin: req.body.admin,
        discoverySource: req.body.discoverySource
    }).then(function(organization, user){
        organization = organization;
        console.log(organization);
        models.Member.create({
            organizationId: organization.organizationId,
            memberEmail: req.user.email,
            userId: req.user.user_id
        },{ where: { user_id: req.user.user_id }});
        // Return the organization Promise instance here to make it
        // available in the next then statememt
        return organization;
    }).then(function(organization, user){
        models.User.update({
            organizationId: organization.organizationId
        });
        res.redirect('/app');
    }).catch(function(error){
        res.send(error);
        console.log('Error at Post' + error);
    })
});

...

关于node.js - Sequelize 对象未定义,但存在于之前的 then 语句中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34842613/

相关文章:

javascript - Uncaught ReferenceError : require is not defined at add. js:1

javascript - 无法在用户对象 (Mongoose) 中保存消息 ID

javascript - moment.js 被添加到数组中

javascript - es6类变量无法读取(无法读取未定义的属性 '...')

node.js - 使用 Mongoose 从文档中删除数组元素

validation - Sequelize 验证方法

mysql - 错误 : Cannot add foreign key constraint-

node.js - 如何在 Express.js 中强制使用 SSL/https

database - 不需要 Sequelize 自动创建的 id 属性

mysql - 如何在相关表中添加子行? (Sequelzie N :M Relationship)