我有以下已创建的Web服务。
router.post('/register', (req, res) => {
const user = req.body;
// registerSchema.validate(user, registerSchema, (err, result) => {
// if (err)
// res.status(500).end(err.message);
// });
findUserByEmail(user.email, (err, userFeedback) => {
console.log('Fired.');
if (userFeedback)
res.status(500).end(JSON.stringify("User already exists"));
});
const passwordPromise = util.promisify(bcrypt.hashSync);
const pass = bcrypt.hashSync(user.password);
createUser(user.name, user.email, pass, [], (err) => {
if (err)
res.status(418).end(JSON.stringify("Failed to create user."));
});
res.status(200).end(JSON.stringify("Signup successful."));
});
我们正在使用它来注册用户。这是我们在Web服务的此部分中调用的方法。
function createUser (userName, userEmail, userPass, dev, cb) {
var mg = require('mongodb').MongoClient;
mg.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function(err, db){
var dbo = db.db(myDB);
var user = { name: userName,
email: userEmail,
password: userPass,
devices: dev };
var insert = util.promisify(dbo.collection("Users").insertOne);
dbo.collection("Users").insertOne(user, function(err, res) {
if (err) throw err;
console.log(`${user.name} has been added.`);
db.close();
sendEmail(userEmail,
'The CRUST Company welcomes you!',
'Thank you for signing up for our services!' );
});
});
}
//See if a user exists
function findUserByEmail (userEmail) {
var mg = require('mongodb').MongoClient;
mg.connect(url, { useNewUrlParser: true, useUnifiedTopology: true },
function(err, db){
var dbo = db.db(myDB);
var query = { email : userEmail };
var find = util.promisify(dbo.collection("Users").find);
return dbo.collection("Users").find(query).toArray(function(err, result) {
if (err) throw err;
db.close();
});
});
}
createUser似乎工作正常,但是FindUserByEmail根本没有触发。我们甚至尝试了该方法中的console.log,但没有任何响应。为什么不使用这种方法有什么想法?谢谢
答案 0 :(得分:0)
您的调用代码通过Menu(
的回调函数:
Lbl 20
Menu("Advantage or disadvantage?","Neither",21,"Advantage",22,"Double advantage",23,"Triple advantage",24,"Disadvantage",02,"Back to top",00,"Quit",XX
但是,您对该函数的实际实现不接受回调,因此永远不会调用它,因此,您传递的回调也不会被调用。
此外,还有多个异步设计问题。您正在像对待异步操作一样阻塞它们。他们不是。您必须在回调函数内部继续执行代码流,而不是在findUserByEmail()
内部正确执行但在调用它的请求处理程序中未正确执行的函数调用之后。
此外,findUserByEmail(user.email, (err, userFeedback) => {
console.log('Fired.');
if (userFeedback)
res.status(500).end(JSON.stringify("User already exists"));
});
声明一个回调作为参数,但是从不调用它,因此您传递给findUserByEmail()
的回调也永远不会被调用。