2016-01-29 24 views
2

我有一個簡單的表單來註冊/驗證用戶。我能夠成功註冊用戶,但無法進行身份驗證。我試圖研究這個問題,但我還沒有找到任何可以提供幫助的東西。無法在nodeJS中驗證用戶:TypeError:無法使用'in'運算符在fs中搜索'用戶名'

這裏是HTML登錄表單:

<form method="post" action="/login"> 
    <input type="text" name="username" placeholder="username"> 
    <input type="password" name="password" placeholder="password"> 
    <input type="submit" name="submit" value="submit"> 


</form> 

當用戶按下submit按鈕,下面顯示了我的控制檯上:

TypeError: Cannot use 'in' operator to search for 'username' in fs 
    at model.Document.$__buildDoc (/Users/userA/Desktop/loginapp/node_modules/mongoose/lib/document.js:207:39) 
    at model.Document (/Users/userA/Desktop/loginapp/node_modules/mongoose/lib/document.js:61:20) 
    at model.Model (/Users/userA/Desktop/loginapp/node_modules/mongoose/lib/model.js:45:12) 
    at new model (/Users/userA/Desktop/loginapp/node_modules/mongoose/lib/model.js:2957:11) 
    at Strategy.model [as _verify] (/Users/userA/Desktop/loginapp/node_modules/mongoose/lib/model.js:2956:14) 
    at Strategy.authenticate (/Users/userA/Desktop/loginapp/node_modules/passport-local/lib/strategy.js:90:12) 
    at attempt (/Users/userA/Desktop/loginapp/node_modules/passport/lib/middleware/authenticate.js:348:16) 
    at authenticate (/Users/userA/Desktop/loginapp/node_modules/passport/lib/middleware/authenticate.js:349:7) 
    at Layer.handle [as handle_request] (/Users/userA/Desktop/loginapp/node_modules/express/lib/router/layer.js:95:5) 
    at next (/Users/userA/Desktop/loginapp/node_modules/express/lib/router/route.js:131:13) 
    at Route.dispatch (/Users/userA/Desktop/loginapp/node_modules/express/lib/router/route.js:112:3) 
    at Layer.handle [as handle_request] (/Users/userA/Desktop/loginapp/node_modules/express/lib/router/layer.js:95:5) 
    at /Users/userA/Desktop/loginapp/node_modules/express/lib/router/index.js:277:22 
    at Function.process_params (/Users/userA/Desktop/loginapp/node_modules/express/lib/router/index.js:330:12) 
    at next (/Users/userA/Desktop/loginapp/node_modules/express/lib/router/index.js:271:10) 
    at SessionStrategy.strategy.pass (/Users/userA/Desktop/loginapp/node_modules/passport/lib/middleware/authenticate.js:325:9) 

app.js:

var express = require('express'); 
var app = express(); 
var mongoose = require('mongoose'); 
var session = require('express-session'); 
var passport = require('passport'); 
var bodyParser = require('body-parser'); 
var User = require('./model/user.js'); 
var LocalStrategy = require('passport-local').Strategy; 
var passportLocalMongoose = require('passport-local-mongoose'); 
var ejs = require('ejs'); 
var dbURL = 'mongodb://Admin:[email protected]:51655/yelpcamp'; 


mongoose.connect(dbURL, function(err) { 
    err ? console.log(err) : console.log('successfully connected to db!'); 
}); 


app.set('view engine', 'ejs'); 
app.use(bodyParser.urlencoded({extended:true})); 


app.use(session({ 
    secret:"sfsdfsdfsd", 
    resave: false, 
    saveUninitialized: false 
})); 

app.use(passport.initialize()); 
app.use(passport.session()); 

passport.use(new LocalStrategy(User, User.authenticate())); 
passport.serializeUser(User.serializeUser()); 
passport.deserializeUser(User.deserializeUser()); 

app.post("/login", passport.authenticate("local", { 

    successRedirect: "/secret", 
    failureRedirect: "/login" 


}), function(req,res) { 
}); 

user.js:

var mongoose = require('mongoose'); 
var passportLocalMongoose = require('passport-local-mongoose'); 

var userSchema = new mongoose.Schema({ 
    username: String, 
    password: String, 
    email: String, 
    pictures: [{type:mongoose.Schema.Types.ObjectId, ref: "Pictures"}], 
    comments: [{type: mongoose.Schema.Types.ObjectId, ref: "Comments" }] 
}); 

userSchema.plugin(passportLocalMongoose); 
var User = mongoose.model("User", userSchema); 

module.exports = User; 

的package.json:

"dependencies": { 
    "body-parser": "^1.14.2", 
    "connect-mongo": "^1.1.0", 
    "ejs": "^2.4.1", 
    "express": "^4.13.4", 
    "express-session": "^1.13.0", 
    "mongoose": "^4.3.7", 
    "passport": "^0.3.2", 
    "passport-local": "^1.0.0", 
    "passport-local-mongoose": "^4.0.0" 
    } 

UPDATE1:要解決這個問題,我試圖實例化用戶對象的用戶類(mongoose.Schema已更改爲新mongoose.Schema)。我也嘗試將策略屬性添加到LocalPassport。 gnerkus指出了這些錯誤,但他們沒有解決這個問題,因爲我得到了同樣的錯誤。

回答

1

發生此錯誤的原因是User對象未被實例化。這是因爲該模型無效。應該將Mongoose模式創建爲mongoose.Schema構造函數的實例。你需要重構你的模型使用Schema實例:

// Create instance of 'Schema' constructor. 
var userSchema = new mongoose.Schema({ 
    username: String, 
    password: String, 
    email: String, 
    pictures: [{type:mongoose.Schema.Types.ObjectId, ref: "Pictures"}], 
    comments: [{type: mongoose.Schema.Types.ObjectId, ref: "Comments" }] 
}); 

而且,從passport-localStrategy對象獲得的LocalStrategy構造。您需要替換這一行:

var LocalStrategy = require('passport-local'); 

這一行:

var LocalStrategy = require('passport-local').Strategy; 
+0

謝謝你的答覆。我試過這段代碼,但同樣的問題依然存在。 – Frosty619

+0

我發現瞭解決方案。請參閱最新的答案。 – gnerkus

+0

我做了建議的更改(基本上是在添加新的mongoose.Schema之前添加了新的功能),但沒有奏效;同樣的問題仍然存在。 不過,謝謝你指出這個錯誤(: – Frosty619

相關問題