Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js sequelize ORM异步方法调用_Node.js_Express_Sequelize.js - Fatal编程技术网

Node.js sequelize ORM异步方法调用

Node.js sequelize ORM异步方法调用,node.js,express,sequelize.js,Node.js,Express,Sequelize.js,如何在sequelize ORM中异步调用方法?(因为我必须在其他方法中使用返回值) user.dao.js: var User = require('./user.model'); class UserDao { constructor() {} insert(user) { var pk; User.sync({ force: false }).then(() => { User.create(user).then(function(user) {

如何在sequelize ORM中异步调用方法?(因为我必须在其他方法中使用返回值)

user.dao.js:

var User = require('./user.model');

class UserDao {
constructor() {}

insert(user) {
    var pk;
    User.sync({ force: false }).then(() => {
        User.create(user).then(function(user) {
            console.log('Entry successful from dao: ' + 
    JSON.stringify(user));
            //return generated pk
            pk = user.id;
            console.log('ID: ' + pk);
        });
    });
    return pk;
}
user.test.js:

class UserDaoTest {
constructor() {
    this.userDao = new UserDao();
    this.compare = new UtilsObject();
}

/*
    all CRUD method calls
*/
testAll() {
    this.testInsert();
    this.testUpdate();
    //this.testDelete();
    //this.testRead();
    //this.compare();
}

/*
    insert method
*/
testInsert() {
    // composite form
    var user = {
        name: 'nisha',
        email: 'nisha@gmail.com',
        phoneNo: 8978,
        picUrl: 'nisha',
        description: 'SI',
        status: 'active',
        waitingTime: 10,
        rating: 7
    };

    /*
        calling insert user with above data
    */
    var pk = this.userDao.insert(user);
    console.log('pk value: ' + pk);
    //var obj1 = this.userDao.readById(pk);
    console.log('obj1 value: ' + user);
    //this.testReadById(obj1);
}

testReadById(obj1) {
    var obj2 = this.userDao.readById(obj1);
    this.compare.compare(obj1, obj2);
    this.testDelete(obj1);
}
}

export default UserDaoTest;
这里在user.test.js中,在testInsert()方法中,我想获取从user.dao.js的insert()方法返回的pk值,但是现在我得到的pk值是未定义的

使用承诺链。 假设您需要为某个特定用户获取一个条目,并对其执行一些操作

Model.User.findById(someId)
.then((user) => {
   // Do something with user.
})

您不应该同步调用方法,NodeJs不是这样设计的。它与回调或承诺一起工作。

您的代码无法工作,因为它是异步代码

看著名的

但简而言之,如果您将运行以下示例,它与您的代码类似,但没有逻辑:

var User = require('./user.model');

class UserDao {
constructor() {}

insert(user) {
    var pk; 
    console.log('1');
    User.sync({ force: false }).then(() => {
        pk = 123;
        console.log('3'); 
    });
    console.log('2');
    return pk; 
}
变量
pk
将是
未定义的
,您的控制台将如下所示:

1
2
3
var User = require('./user.model');

class UserDao {
    constructor() {}

    // @return Promise
    insert(user) {
         return User.sync({ force: false }).then(() => {
             return User.create(user)
         }).then((user) => {
             console.log('Entry successful from dao: ' + JSON.stringify(user));
             return user.id
         })
    }
如果您想让它工作,您应该“等待”异步函数,如下所示:

1
2
3
var User = require('./user.model');

class UserDao {
    constructor() {}

    // @return Promise
    insert(user) {
         return User.sync({ force: false }).then(() => {
             return User.create(user)
         }).then((user) => {
             console.log('Entry successful from dao: ' + JSON.stringify(user));
             return user.id
         })
    }
当你使用它时:

class UserDaoTest {
    constructor() {
        this.userDao = new UserDao();
        this.compare = new UtilsObject();
    }

    /*
        all CRUD method calls
    */
    testAll() {
        // if testInsert and testUpdate can run simultaneously you can keep it like this. 
        // Otherwise, use Promise.then as well
        this.testInsert();
        this.testUpdate(); 
    }

    /*
        insert method
    */

    testInsert() {
        var user = {
            // ...
        };

        /*
            calling insert user with above data
        */
        this.userDao.insert(user).then((userId) => {
            // YOUR COMPARE CODE
        }).then(done); // Where done is a function to let you test framework that you async code is done
    }
}

export default UserDaoTest;
另一种方法是使用新的
async
wait
。这样,您将得到一个可读性和可维护性更强的代码

你可以读更多