我试图实现passport-local
但我不断收到这个错误,当我与邮差测试:Cannot read property 'username' of undefined
Passport.js:无法读取未定义(节点)的特性“用户名”
这里是我的模型,User.js
:
const mongoose = require('mongoose');
const {Schema} = mongoose;
const passportLocalMongoose = require('passport-local-mongoose');
const User = new Schema({
username: String,
\t email: String,
password: String,
firstName: String,
lastName: String
});
User.plugin(passportLocalMongoose);
module.exports = mongoose.model('User', User);
路线:routes/authRoutes.js
:
const express = require('express');
const passport = require('passport');
const User = require('../models/User.js');
module.exports = app => {
// POST to /register
app.post('/api/register', (req, res) => {
// Create a user object to save, using values from incoming JSON
const newUser = new User({
username: req.body.username,
firstName: req.body.firstName,
lastName: req.body.lastName,
email: req.body.email,
});
// Save, via passport's "register" method, the user
User.register(newUser, req.body.password, (err, user) => {
// If there's a problem, send back a JSON object with the error
if (err) {
return res.send(JSON.stringify({ error: err }));
}
// Otherwise, for now, send back a JSON object with the new user's info
return res.send(JSON.stringify(user));
});
});
}
index.js
:
const express = require('express');
const mongoose = require('mongoose');
const passportLocalMongoose = require('passport-local-mongoose');
const keys = require('./config/keys');
const session = require('express-session');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const MongoStore = require('connect-mongo')(session);
mongoose.connect(keys.mongoURI);
const app = express();
app.use(require('express-session')({
secret: 'secretsecret',
resave: false,
saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
require('./routes/authRoutes')(app);
// Configure Passport
const User = require('./models/User');
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
require('./routes/authRoutes')(app);
const PORT = process.env.PORT || 5000;
app.listen(PORT);
而且我package.json
:
{
"name": "server",
"version": "1.0.0",
"description": "",
"main": "index.js",
"engines": {
"node": "8.1.1",
"npm": "5.0.3"
},
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"connect-mongo": "^1.3.2",
"express": "^4.15.4",
"express-session": "^1.15.5",
"mongoose": "^4.11.11",
"passport": "^0.4.0",
"passport-local": "^1.0.0",
"passport-local-mongoose": "^4.2.1"
}
}
我已经检查了其他类似的问题,但他们的解决方案不是我的解决方案,他们大多数都没有初始化Passport。
edit:
邮差日志: POST http://localhost:5000/api/register
{ "username": "Test", "email": "[email protected]", "password": "password", "firstName": "Testt", "lastName": "Teststs" }
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>TypeError: Cannot read property 'username' of undefined
<br> at app.post (server/routes/authRoutes.js:10:25)
<br> at Layer.handle [as handle_request] (server/node_modules/express/lib/router/layer.js:95:5)
<br> at next (server/node_modules/express/lib/router/route.js:137:13)
<br> at Route.dispatch (server/node_modules/express/lib/router/route.js:112:3)
<br> at Layer.handle [as handle_request] (server/node_modules/express/lib/router/layer.js:95:5)
<br> at /server/node_modules/express/lib/router/index.js:281:22
<br> at Function.process_params (/server/node_modules/express/lib/router/index.js:335:12)
<br> at next (/server/node_modules/express/lib/router/index.js:275:10)
<br> at SessionStrategy.strategy.pass (/server/node_modules/passport/lib/middleware/authenticate.js:338:9)
<br> at SessionStrategy.authenticate (/server/node_modules/passport/lib/strategies/session.js:75:10)
<br> at attempt (/server/node_modules/passport/lib/middleware/authenticate.js:361:16)
<br> at authenticate (/server/node_modules/passport/lib/middleware/authenticate.js:362:7)
<br> at Layer.handle [as handle_request] (/server/node_modules/express/lib/router/layer.js:95:5)
<br> at trim_prefix (/server/node_modules/express/lib/router/index.js:317:13)
<br> at /server/node_modules/express/lib/router/index.js:284:7
<br> at Function.process_params (/server/node_modules/express/lib/router/index.js:335:12)
<br> at next (/server/node_modules/express/lib/router/index.js:275:10)
<br> at initialize (/server/node_modules/passport/lib/middleware/initialize.js:53:5)
<br> at Layer.handle [as handle_request] (/server/node_modules/express/lib/router/layer.js:95:5)
<br> at trim_prefix (/server/node_modules/express/lib/router/index.js:317:13)
<br> at /server/node_modules/express/lib/router/index.js:284:7
<br> at Function.process_params (/server/node_modules/express/lib/router/index.js:335:12)
</pre>
</body>
</html>
嘿,我想这是因为你需要使用这个库来做到这一点https://github.com/expressjs/body-parser'身体parser'的。让我知道这是否有帮助。 –
@CodeCooker我在'index.js'中安装了body-parser,声明为'const bodyParser = require('body-parser')',但错误仍然存在。 –