Estoy codificando Nodejs y obtener este problema con la función de autenticación como esta. Todo el problema proviene de la función User.getUser y proviene de findOne. Pero no sé cómo arreglarlo. Además, tengo código con mangosta y jwt. El error es : [ingrese la descripción de la imagen aquí][1] ¿Cómo puedo solucionar con la función findOne. Gracias.

const express = require('express');
const dotenv = require('dotenv');
const morgan = require('morgan');
const bodyParser = require('body-parser');
const User=require('../models/UserModels');
const bcrypt=require('bcrypt');
const mongoose = require('mongoose');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
//var passport = require('../server1/database/config/passport');
var passportJWT = require('passport-jwt');
var ExtractJwt = passportJWT.ExtractJwt;
var JwtStrategy = passportJWT.Strategy;
var jwtOptions = {};
var jwt = require('jsonwebtoken');
var config=require('./config/main');
const randtoken = require('rand-token');
//const database=require('../database/index.js')
//const blockchain = require("../blockchain/index");

// jwtOptions.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
jwtOptions.secretOrKey = 'thisisanexamplesecret';

const PORT = process.env.PORT || 3000;
const db = mongoose.connection;

// app.set("view engine", "ejs");
// app.set("views", "./views");
// app.use(express.static("public"));
// app.use(morgan("dev"));
// app.use(bodyParser.json());
// app.use(cookieParser());
// app.use(bodyParser.urlencoded({ extended: true }));


dotenv.config();

//connect to db
mongoose.set('useCreateIndex', true);
mongoose.connect(process.env.DB_URL,{ useNewUrlParser: true, useUnifiedTopology: true }).then(() => console.log("Success."));
db.on('error',(err)=>{
    console.log("Error: "+ err.message);

});

// function thêm mới 1 user
const createUser = async({email, password,card_name,role}) => {
    return await User.create({ email, password,card_name,role });
};

// function lấy ra danh sách users
const Users = async() => {
    return await User.find();
};

// function lấy ra 1 users
const getUser = async obj => {
    return await User.findOne({
        where: obj,
    });
};

function Authentication(req,res,onSuccess){
    var {email,password}=req.body;
    var usermain=User.getUser({email:req.body.email},function(err,result,fields){
        if(err){
            onSuccess({success:false,error:err});
            return;
        }
        if(!result[0]){
            onSuccess({ success: false, error: "Authentication failed. User not found." });
            return;
        }
        else{
            if(email&&password){
                // we get the user with the name and save the resolved promise returned
                var user=User.getUser({email:req.body.email})

                if(!user){
                    res.status(401).json({msg:'No such user found', user});
                    onSuccess({ success: false, error: "Authentication failed. User not found." });
                    return;
                }
                hash=bcrypt.hash(''+password,10);

                if(bcrypt.compare(hash,user.password)){
                    // from now on we’ll identify the user by the id and the id is
                    // the only personalized value that goes into our token

                    var payload={email:user.email};
                    var token=jwt.sign(payload,jwtOptions.secretOrKey);
                    res.json({msg: 'ok', token: token});
                    onSuccess({ success: true, token: token});
                    return;
                }else{
                    res.status(401).json({ msg: 'Password is incorrect' });
                    onSuccess({ success: false, error: "Authentication failed. User not found." });
                    return;
                }
            }
        }
    })
}

module.exports={
    Authentication
};```


  [1]: https://i.stack.imgur.com/94EI0.png
0
NGUYEN XUAN SANG 3 nov. 2019 a las 17:57

1 respuesta

Ha creado una función simple llamada getUser. Tienes que llamarlo como una función normal. getUser no es un método del modelo User. ¿Por qué esperas que User.getUser funcione?

Para lograr lo siguiente, puede crear un método estático de mangosta. Ejemplo:

const userSchema = new Schema({ ... ... });
userSchema.statics.getUser = function (name) {
  return this.find({ name: name });
}

Entonces puedes usarlo así:

const User = require('./model/User');
const user = await User.getUser("Name of the user");
0
Dijkstra 3 nov. 2019 a las 15:12