所以我正在尝试创建一个注册路由,检查用户是否存在,并且我在一个需要返回 true
的单独函数中进行数据库调用 false
完成后。问题是我不熟悉回调和整个异步事情,我搜索过的所有东西似乎都不能继续给我。
TypeError: callback is not a function
这是我的代码,我们将不胜感激任何帮助或指示。
function pullUserFromDatabase(username, callback) {
console.log(username); //for debug
mongodb.connect(url, function(err, db) {
if(err) {
console.log("didn't get far" + err) //for debug
}
var collection = db.collection(username);
collection.findOne({username}, function(err, item) {
if(err) {
console.log("nope it broke" + err) //for debug
} else {
console.log("it worked" + JSON.stringify(item)) //for debug
callback(true);
}
});
});
}
app.post("/signup", function(req, res) {
var username = req.headers["username"],
password = req.headers["password"],
randomSalt = crypto.randomBytes(32).toString("hex"),
passwordHashOutput = crypto.createHash('sha256').update(password + randomSalt).digest("hex");
if(!username || !password) {
res.send("Username or password not provided.")
} else if(pullUserFromDatabase(username)) {
res.send("User exist.")
}
});
答案 0 :(得分:1)
您需要按如下方式使用回调:
function pullUserFromDatabase(data, callback) {
console.log(data.username); //for debug
mongodb.connect(url, function(err, db) {
if(err) {
console.log("didn't get far" + err) //for debug
}
var collection = db.collection(data.collection);
collection.find({"username": data.username}).count(function (err, count) {
callback(err, !! count);
});
});
};
app.post("/signup", function(req, res) {
var username = req.headers["username"],
password = req.headers["password"],
randomSalt = crypto.randomBytes(32).toString("hex"),
passwordHashOutput = crypto.createHash('sha256').update(password + randomSalt).digest("hex");
if(!username || !password) {
res.send("Username or password not provided.")
}
var data = {
username: username,
collection: "collectionName"
}
if(!username || !password) {
res.send("Username or password not provided.")
}
pullUserFromDatabase(data, function(err, exists) {
if (err) {
res.send(400, "Error - " + err);
}
else if(exists) {
res.send(200, "User exists.");
}
res.send(200, "User does not exist.");
});
});
答案 1 :(得分:0)
callback
未定义的原因是因为你没有将第二个参数传递给pullUserFromDatabase(username)
提供第二个参数,例如。 pullUserFromDatabase(username, function(result) {/* do something here with the result variable */})
如果你不熟悉aync& amp;回调,您可能会发现使用 promises 更直观,但它有自己的学习曲线。
在原始代码的上下文中,这看起来像:
...
if(!username || !password) {
res.send("Username or password not provided.");
return;
}
pullUserFromDatabase(username, function(result) {
if(result) {
res.send("User exist.");
} else {
// TODO: Handle this case. If res.send() is never called, the HTTP request won't complete
}
});
...
此外,您需要确保始终调用您的回调。添加回调(false):
console.log("nope it broke" + err); //for debug
callback(false);
在"didn't get far"
之后执行类似的步骤,然后执行return
,这样就不会多次调用回调。