无法在 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)

应用.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:123@ds051655.mongolab.com: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) {
});

用户.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:为了解决这个问题,我尝试在用户类(猫鼬。架构已更改为新猫鼬。架构)。我还尝试将策略属性添加到LocalPassport。gnerkus指出了这些错误,但是由于我遇到了相同的错误,因此它们未能解决问题。

发生此错误的原因是未实例化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" }]  
});

此外,构造函数LocalStrategy是从passport-localStrategy对象获取的。您需要替换此行:

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

用这一行:

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

最新更新