【发布时间】:2021-09-15 12:15:04
【问题描述】:
我有一个使用 Node.js/Express 的应用程序。在此代码中,我有以下承诺,旨在检查我的(PostGres)数据库中是否已存在电子邮件:
//queries.js
const checkEmail = function(mail) {
return new Promise(function(resolve, reject) {
pool.query('SELECT * FROM clients WHERE email = $1', [mail], function(error, results) {
if (error) {
reject(new Error('Client email NOT LOCATED in database!'));
} else {
resolve(results.rows[0]);
}
}) //pool.query
}); //new promise
}
在我的“主 (server.js)”脚本文件中,我有一个在提交“注册”表单时调用的路由。处理此路由的帖子时...我运行上面的脚本来检查传递的电子邮件地址是否已经位于数据库中,以及各种其他“散列”例程:
我的代码如下:
//server.js
const db = require('./queries');
const traffic = require('./traffic');
const shortid = require('shortid');
...
app.post('/_join_up', function(req, res) {
if (!req.body) {
console.log('ERROR: req.body has NOT been returned...');
return res.sendStatus(400)
}
var newHash, newName;
var client = req.body.client_email;
var creds = req.body.client_pword;
var newToken = shortid.generate();
var firstname = req.body.client_alias;
db.sanitation(client, creds, firstname).then(
function(direction) {
console.log('USER-SUPPLIED DATA HAS PASSED INSPECTION');
}
).then(
db.checkEmail(client).then(
function(foundUser) {
console.log('HEY THERE IS ALREADY A USER WITH THAT EMAIL!', foundUser);
},
function(error) {
console.log('USER EMAIL NOT CURRENTLY IN DATABASE...THEREFORE IT IS OK...');
}
)).then(
traffic.hashPassword(creds).then(
function(hashedPassword) {
console.log('PASSWORD HASHED');
newHash = hashedPassword;
},
function(error) {
console.log('UNABLE TO HASH PASSWORD...' + error);
}
)).then(
traffic.hashUsername(firstname).then(
function(hashedName) {
console.log('NAME HASHED');
newName = hashedName;
},
function(error) {
console.log('UNABLE TO HASH NAME...' + error);
}
)).then(
db.createUser(client, newName, newHash, newToken).then(
function(data) {
console.log('REGISTERED A NEW CLIENT JOIN...!!!');
res.redirect('/landing'); //route to 'landing' page...
},
function(error) {
console.log('UNABLE TO CREATE NEW USER...' + error);
}
))
.catch(function(error) {
console.log('THERE WAS AN ERROR IN THE SEQUENTIAL PROCESSING OF THE USER-SUPPLIED INFORMATION...' + error);
res.redirect('/');
});
}); //POST '_join_up' is used to register NEW clients...
我的问题是“.then”语句似乎没有按顺序运行。我的印象是这样的命令只能一个接一个地运行……每个命令只有在前一个命令完成时才运行。这是基于显示“console.log”语句读数的日志:
USER-SUPPLIED DATA HAS PASSED INSPECTION
PASSWORD HASHED
NAME HASHED
UNABLE TO CREATE NEW USER...Error: Unable to create new CLIENT JOIN!
USER EMAIL NOT CURRENTLY IN DATABASE...THEREFORE IT IS OK...
如前所述,我的印象是 '.then' 语句应该同步运行,因此最后一条语句(“用户电子邮件当前不在数据库中......因此它没问题......”)实际上应该是根据'.then'语句的布局,在第一个之后......在“PASSWORD HASHED”之前。这是正常行为...还是我的代码有错误?
对于我的困惑,我感到抱歉,但我发现 '.then' 陈述和承诺由于某种原因有些令人困惑。提前谢谢你。
【问题讨论】:
标签: node.js express promise synchronous