【发布时间】:2017-07-31 20:06:03
【问题描述】:
我正在尝试了解如何在另一个 Promise 中解决一个 Promise。
我希望实现的步骤如下:
- 通过
UserManager(功能)通过其ID获取User - 更改其
firstName - 通过
UserManager将User保存到数据库中(功能)
我正在测试UserManager.saveUser(user); 的响应,它在成功时返回true。但我遇到了一个错误。
UserManagerTest.js
//[...]
it("Should save a user to the database", function () {
var response = UserManager.getUserByLogin("Foo.Bar@provider.com", "Test")
.then(function (user) {
user.firstName = "Macarena";
return UserManager.saveUser(user);
})
.catch((error) => {
console.log("This error occured: "+error);
return false;
})
return Promise.all([
expect(response).to.eventually.be.true
]);
});
//[...]
控制台输出
1) UserManager Save Should save a user to the database:
AssertionError: expected undefined to be true
at node_modules/chai-as-promised/lib/chai-as-promised.js:305:22
at process._tickCallback (internal/process/next_tick.js:109:7)
UserManager.js
static saveUser(user){
return new Promise((resolve, reject) => {
pool.getConnection((err, connection)=> {
if(err) reject(err);
connection.query("SHOW COLUMNS FROM User;", (error, results, fields) => {
if(error) reject(error);
var availableFields = {savable: [], primary: []};
//[...]
resolve(availableFields);
});
connection.release();
});
})
.then((result) => {
var usedFields = {savable: [], primary: []};
//[...]
return usedFields;
})
.then((result) => {
var sqlParams = [];
var sql = "UPDATE User SET";
//[...]
sql += ";";
pool.getConnection((err, connection) => {
if(err) throw err;
connection.query(sql, sqlParams, (error, results, fields) => {
if(error) throw error;
connection.release();
return results.affectedRows == 1;
});
});
})
.catch((error) => {
console.log(error);
throw error;
})
};
【问题讨论】:
-
在这里猜测,但是,如果你的 connection.release();在connection.query里面?似乎您可以在获得结果之前释放连接。我没有看到其他对我来说很突出的东西。
-
根据documentation,您是对的,但这不会改变问题。在
return语句之前添加console.log(results.affectedRows);会显示正确的结果。并测试此函数是否正确更新了数据库中的值。 -
不是原因,而是 FWIW:
if(err) reject(err);将继续运行其余代码(并且可能会导致connection.query()抛出错误);一旦你拒绝了承诺,请使用return来防止这种情况(或使用if (err) return reject(err))
标签: javascript node.js promise mocha.js chai