Ошибка типа: невозможно прочитать свойство '0' из неопределенного в nodejs mongoose - PullRequest
0 голосов
/ 08 апреля 2020

Вот код

const {validationResult} = require('express-validator');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const User = require('../models/user');


exports.login = (req, res, next) => {
const email = req.body.email;
const password = req.body.password;
let loadedUser;
User.findOne({email:email})
.then(user => {
    if(user){
        loadedUser = user;
        return bcrypt.compare(password, user.password);
    } else{
        const error = new Error('EMAILID_NOT_FOUND');
        error.statusCode = 401;
        throw error;
    }

})
.then(
    isEqual => {
        console.log(isEqual);
        if(!isEqual){
            const error = new Error('WRONG_PASSWORD');
            console.log(error)
            error.statusCode = 401;
            throw error;
        }
        const token = jwt.sign({
            email: loadedUser.email,
            userId: loadedUser._id.toString()
        },'somesecrekey',{expiresIn:'7d'}
        );
        res.status(200).json({
            token: token,
            userId: loadedUser._id.toString()
        });
        })
        .catch(err => {
            if(!err.statusCode){
                err.statusCode =500;
            }
            next(err);
        });
};

app.js

const express = require('express');
const bodyparser = require('body-parser');
const mongoose = require('mongoose');

const path = require('path');

const eventRoutes = require('./routes/eventRouter');
const companyRoutes = require('./routes/companyRouter');
const authrouter = require('./routes/authrouter');

const app = express();

// app.use(bodyparser.urlencoded());

app.use(bodyparser.json()); //application/json
app.use('/images',express.static(path.join(__dirname, 'images'))); 

app.use((req, res, next)=>{
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, 
DELETE');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
next();
})

app.use('/auth', authrouter);
app.use('/event', eventRoutes);
app.use('/company',companyRoutes);

app.use((error, req, res, next)=>{
const status = error.statusCode || 500;
const message = error.message;
const data = error.data;
const errmsg = data[0].msg;
res.status(status).json({ error: message, errmsg: errmsg, data: data });
});

mongoose.connect('mongodb://localhost:27017/scope').then(result=>{
app.listen(8080)   
}).catch(err => console.log(err));

Я пытаюсь выполнить аутентификацию в nodejs, и понедельник goose

, когда пользователь нажимает кнопку входа в API, будет вызван с тело сообщения электронной почты и пароль, когда элемент управления переходит к функции входа в систему, он проверяет наличие или отсутствие электронной почты в базе данных, а также проверку правильности пароля или нет

Здесь я получаю сообщение об ошибке как Ошибка типа: невозможно прочитать свойство '0' из неопределенного

с сообщением об ошибке

Error: WRONG_PASSWORD
at User.findOne.then.then.isEqual (F:\Codebase\Ack 
Codebase\SCOPE\scope_server\controllers\authcontroller.js:63:31)
App Error: WRONG_PASSWORD
TypeError: Cannot read property '0' of undefined
at app.use (F:\Codebase\Ack Codebase\SCOPE\scope_server\app.js:34:24)
at Layer.handle_error (F:\Codebase\Ack 
Codebase\SCOPE\scope_server\node_modules\express\lib\router\layer.js:71:5)
at trim_prefix (F:\Codebase\Ack 
Codebase\SCOPE\scope_server\node_modules\express\lib\router\index.js:315:13)
at F:\Codebase\Ack 
Codebase\SCOPE\scope_server\node_modules\express\lib\router\index.js:284:7
at Function.process_params (F:\Codebase\Ack 
Codebase\SCOPE\scope_server\node_modules\express\lib\router\index.js:335:12)
at Immediate.next (F:\Codebase\Ack 
Codebase\SCOPE\scope_server\node_modules\express\lib\router\index.js:275:10)
at Immediate.<anonymous> (F:\Codebase\Ack 
Codebase\SCOPE\scope_server\node_modules\express\lib\router\index.js:635:15)
at runCallback (timers.js:706:11)
at tryOnImmediate (timers.js:676:5)
at processImmediate (timers.js:658:5)

Пожалуйста, помогите спасибо

1 Ответ

0 голосов
/ 08 апреля 2020

Кажется, проблема в этих строках

const data = error.data;
const errmsg = data[0].msg;

кажется, что у объекта error нет массива с именем data, тогда он не может прочитать свойство 0 несуществующего массива

вы можете забыть передать этот массив данных объекту ошибки, вам нужно проверить, что

также мы могли бы сделать какой-то трюк для устранения ошибок такого рода

app.use((error, req, res, next) => {
    // first we could double check if error object exists or not
    error = error || {}; // if error does not exist, then it will be an empty object

    const status = error.statusCode || 500;

    const message = error.message || 'No Error Message'; // if error message does not exist, it will 'No Error Message'

    const data = error.data || []; // if error object does not have an array called data, then assign it an empty array

    const errmsg = (data[0] || {}).msg || 'No Error';
    // double check data[0] too if it does not exist, then assume it's an empty object, then get the msg, if it does not exist too, assume it's 'No Error'

    res.status(status).json({ error: message, errmsg: errmsg, data: data });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...