首页 > 解决方案 > 我正在做 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");
})

标签: node.jsmongodbexpressauthenticationmongoose

解决方案


如果这里的问题是findOrCreate您可以继续使用findOneAndUpdate并设置upsert: true. 如果没有找到任何符合给定条件的记录,这将创建一个新记录。

你可以在这里找到更多信息


推荐阅读