![](/img/trans.png)
[英]Javascript function inside if statement still runs even though condition is not met
[英]If statement runs but condition is not met
我正在使用 NodeJS、PassportJS、MySQL 和 Sequalize(ORM for MySQL)。 此代碼來自我的 Passport.JS 文件。 當用戶在我的網站上注冊並使用用戶名或電子郵件時,我將返回一個錯誤。 如果在數據庫中找不到用戶名和電子郵件,將創建一個新的創建帳戶。
但是創建新帳戶的 else 語句永遠不會運行。 當我使用未使用的電子郵件和用戶名創建新帳戶時會發生此錯誤。
未處理的拒絕類型錯誤:無法讀取 null 處未定義的屬性“用戶名”。 (/home/ubuntu/workspace/Authentication.1/config/passport/passport.js:59:21) 在 tryCatcher (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/release/ util.js:16:23) 在 Promise._settlePromiseFromHandler (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:512:31) 在 Promise._settlePromise (/ home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:569:18) 在 Promise._settlePromise0 (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/ node_modules/bluebird/js/release/promise.js:614:10) 在 Promise._settlePromises (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:693: 18) 在 Async._drainQueue (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/release/async.js:133:16) 在 Async._drainQueues (/home/ubuntu/workspace/ Authentication.1/node_modules/sequel ize/node_modules/bluebird/js/release/async.js:143:10) 在 Immediate.Async.drainQueues [as _onImmediate] (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/ release/async.js:17:14) 在 processImmediate [as _immediateCallback] (timers.js:396:17)
// SELECT * FROM users WHERE username = username || email = ...
User.findAll({
where: {
$or: [{username: username}, {email: req.body.email}]
}
}).then(function(user){
// console.log('====================');
// console.log(user);
// console.log(user[0].username);
// console.log(req.body.username);
// console.log(user[0].email);
// console.log(req.body.email);
// console.log('====================');
// If a user is returned from the database run this if statement
if(user != null) {
// GETTING ERROR HERE. If username is already in database return err
if(user[0].username == req.body.username) { **//THIS LINE CAUSE ERROR **
console.log(user[0].username);
return done(null, false, console.log("USER TAKEN"),{message : 'That username is already taken'} );
}
// If email is already in database return err.
else if(user[0].email == req.body.email) {
return done(null, false, console.log("EMAIL TAKEN"),{message : 'That email is already taken'} );
}
}
else CREATE NEW ACCOUNT... // this never runs for some reason
> 整個 PASSPORT.JS 文件
passport.use('local-signup', new LocalStrategy(
{
usernameField : 'username',
passwordField : 'password',
passReqToCallback : true // allows us to pass back the entire request to the callback
},
function(req, username, password, done){
var generateHash = function(password) {
return bCrypt.hashSync(password, bCrypt.genSaltSync(8), null);
};
User.findAll({
where: {
$or: [{username: username}, {email: req.body.email}]
}
}).then(function(user){
// console.log('====================');
// console.log(user);
// console.log(user[0].username);
// console.log(req.body.username);
// console.log(user[0].email);
// console.log(req.body.email);
// console.log('====================');
if(user != null) {
if(user[0].username == req.body.username) {
console.log(user[0].username);
return done(null, false, console.log("USER TAKEN"),{message : 'That username is already taken'} );
}
else if(user[0].email == req.body.email) {
return done(null, false, console.log("EMAIL TAKEN"),{message : 'That email is already taken'} );
}
}
else
{
var userPassword = generateHash(password);
var data =
{
username: username,
password: userPassword,
email: req.body.email
};
如果您使用 user[0],則 user 是一個數組
條件是:
if(user != null && user.length > 0) {
看起來您正在檢查 user[0].username 或 req.body.username 在它不存在的情況下。 如果是這種情況,您可以在 if 語句中添加額外的檢查,以確保在更高層密鑰不存在的情況下不檢查用戶名,例如:
if (user[0] && req.body && (user[0].username == req.body.username)) {
// your code here
}
我會檢查錯誤所引用的行,以確定是用戶還是主體具有未定義的用戶名。 否則,正如 adeneo 所提到的,您可能沒有運行 body-parser。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.