node.js - 我正在做 Oath facebook 登录,但每次 findorcreate 都会出错
问题描述
这是我收到错误的代码。我正在尝试登录 facebook。我在其中设置了 facebook 开发者帐户。但是每次都会出错。我烦了。我想为用户名和密码创建两个表,另一个用于内容和标题。所以这就是我创建两个模型的原因。如果对项目有任何建议,也会给予。这是错误,上面写着:
TypeError: Member.findOrCreate is not a function
at Strategy._verify (E:\html\backend\server.js:29:12)
at E:\html\backend\node_modules\passport-oauth2\lib\strategy.js:202:24
at E:\html\backend\node_modules\passport-facebook\lib\strategy.js:183:5
at passBackControl (E:\html\backend\node_modules\oauth\lib\oauth2.js:134:9)
at IncomingMessage.<anonymous> (E:\html\backend\node_modules\oauth\lib\oauth2.js:157:7)
at IncomingMessage.emit (events.js:327:22)
at endReadableNT (internal/streams/readable.js:1327:12)
at processTicksAndRejections (internal/process/task_queues.js:80:21)
require('dotenv').config();
const express = require ("express");
const mongoose = require ("mongoose");
const bodyParser = require("body-parser");
const bcrypt = require ("bcrypt");
const passport = require('passport'), FacebookStrategy = require('passport-facebook').Strategy;
const findOrCreate = require('mongoose-findorcreate')
const passportLocalMongoose= require("passport-local-mongoose")
const app = express();
const Saltround = 10;
app.set('view engine', 'ejs');
app.use(express.static("public"));
mongoose.connect(process.env.SERVER, { useUnifiedTopology: true, useNewUrlParser: true });
app.use(bodyParser.urlencoded({extended: true}));
app.get("/", function(req, res){
res.render("login.ejs")
})
const UserSchema=new mongoose.Schema({
title: String ,
content : String
})
const MembersSchema=new mongoose.Schema({
email: String,
password: String,
facebookId: String
})
const User=mongoose.model("Users", UserSchema);
const Member=mongoose.model("Members", MembersSchema);
MembersSchema.plugin(passportLocalMongoose)
MembersSchema.plugin(findOrCreate)
app.get('/auth/facebook',
passport.authenticate('facebook'));
app.get('/auth/facebook/secrets',
passport.authenticate('facebook', { failureRedirect: '/login' }),
function(req, res) {
// Successful authentication, redirect home.
res.redirect('/secret');
});
passport.use(new FacebookStrategy({
clientID: process.env.APP_ID_FB,
clientSecret: process.env.APP_SECRET,
callbackURL: "http://localhost:3000/auth/facebook/secrets"
},
function(accessToken, refreshToken, profile, cb) {
Member.findOrCreate({ facebookId: profile.id }, function (err, user) {
return cb(err, user);
});
}
));
app.post("/add", function (req, res){
const Title= req.body.title
const Content =req.body.content
const newItem=new User({
title: Title,
content: Content
})
newItem.save();
})
app.post("/delete", function(req, res){
const Id=req.body.id;
User.findByIdAndDelete(Id, function(err, docs){
if(err)console.log(err)
else
console.log(docs);
})
})
app.post("/login", function(req, res){
const Email=req.body.Email;
const Password=req.body.Password;
bcrypt.hash(Password, Saltround, function(err, hash){
const newMember= new Member({
email: Email,
password: hash
})
newMember.save();
})
})
app.listen(3000, ()=>{
console.log("server is running");
})
解决方案
如果这里的问题是findOrCreate
您可以继续使用findOneAndUpdate
并设置upsert: true
. 如果没有找到任何符合给定条件的记录,这将创建一个新记录。
你可以在这里找到更多信息
推荐阅读
- sqlalchemy - Query all fields when using single table inheritance
- python - 如何删除其他 python 版本并继续使用 python 3.5
- r - 使用 dplyr 迭代 t 检验
- javascript - 当 Accordion SelectedIndexChanged 时从动态创建的 Accordion 面板获取 Pane.ID
- google-app-engine - Appengine - 上传文件时出现 tmp/文件系统错误
- css - 如何阻止(但不阻止!)浏览器在元素中自动换行?
- c++ - 创建部分屏幕外的 ncurses 窗口
- r - 交叉表有两个以上组时的 Dplyr 计算
- r - 在 R 中按比例分组
- graphdb - GraphDB 在事务中读取、检查和更新