Node.js sequelize ORM异步方法调用
如何在sequelize ORM中异步调用方法?(因为我必须在其他方法中使用返回值) user.dao.js: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) {
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
。这样,您将得到一个可读性和可维护性更强的代码
你可以读更多