2016-10-13 5 views
0

내 ReactJS 프로젝트에서 현재 NodeJS 및 ExpressJS로 서버를 실행 중이고 MongoClient를 사용하여 MongoDB에 연결 중입니다. 사용자의 사용자 이름과 암호로 요청을 받아들이도록 설정 한 로그인 API 끝점을 설정했습니다. 사용자를 찾을 수 없으면 오류를 catch하고 프런트 엔드에 오류 (status(500))로 응답해야합니다.ReactJS + MongoDB + NodeJS/ExpressJS : process.nextTick (function() {throw err;});은 무엇입니까?

그러나 json 오류로 프런트 엔드에 응답하는 대신 서버가 손상됩니다. 나는 이유를 알아 내기 위해 모든 것을 시도했지만 여전히 운이 없다.

어떻게하면 다음 오류를 해결할 수 있습니까? 어떤 지침이나 통찰력이라도 대단히 감사 드리며 대답을 upvote 및 동의합니다.

데이터베이스에 존재하지 않는 사용자 이름과 암호 ({ username: 'iopsert', password: 'vser'})를 사용하여 의도적으로 요청했습니다. 여기

은 로그인 엔드 포인트입니다 :

//login endpoint 
app.post('/api/login/', function(req, res) { 
    console.log('Req body in login ', req.body) 

    console.log('THIS IS WHAT WAS PASSED IN+++++', req._id) 

    db.collection('users').findOne({username: req.body.username}, function(err, user) { 
    console.log('User found ') 

    if(err) { 
     console.log('THIS IS ERROR RESPONSE') 
     // Would like to send this json as an error response to the front-end 
     res.status(500).send({ 
     error: 'This is error response', 
     success: false, 
     }) 
    } 

    if(user.password === req.body.password) { 
     console.log('Username and password are correct') 
     res.status(500).send({ 
     username: req.body.username, 
     success: true, 
     user: user, 
     }) 
    } else { 
     res.status(500).send({ 
     error: 'Credentials are wrong', 
     success: false, 
     }) 
    } 
    }) 

그리고 여기에 터미널 오류 로그입니다 :

var handleCallback = function(callback, err, value1, value2) { 
    try { 
    if(callback == null) return; 
    if(value2) return callback(err, value1, value2); 
    return callback(err, value1); 
    } catch(err) { 
    process.nextTick(function() { throw err; }); 
    return false; 
    } 

    return true; 
} 

편집 :

Req body in login { username: 'iopsert', password: 'vset' } 
THIS IS WHAT WAS PASSED IN+++++ undefined 
User found 
/Users/John/practice-project/node_modules/mongodb/lib/utils.js:98 
    process.nextTick(function() { throw err; }); 
           ^

TypeError: Cannot read property 'password' of null 
    at /Users/John/practice-project/server/server.js:58:12 
    at handleCallback (/Users/John/practice-project/node_modules/mongodb/lib/utils.js:96:12) 
    at /Users/John/practice-project/node_modules/mongodb/lib/collection.js:1395:5 
    at handleCallback (/Users/John/practice-project/node_modules/mongodb/lib/utils.js:96:12) 
    at /Users/John/practice-project/node_modules/mongodb/lib/cursor.js:675:5 
    at handleCallback (/Users/John/practice-project/node_modules/mongodb-core/lib/cursor.js:165:5) 
    at setCursorNotified (/Users/John/practice-project/node_modules/mongodb-core/lib/cursor.js:505:3) 
    at /Users/John/practice-project/node_modules/mongodb-core/lib/cursor.js:578:16 
    at queryCallback (/Users/John/practice-project/node_modules/mongodb-core/lib/cursor.js:226:18) 
    at /Users/John/practice-project/node_modules/mongodb-core/lib/connection/pool.js:430:18 

그리고 /Users/John/practice-project/node_modules/mongodb/lib/utils.js:98은 다음을 참조한다

여기 16,

서버로 가져 오는 모든 일들은 다음과 같습니다

"use strict" 

var express = require('express'); 
var path = require('path'); 
var config = require('../webpack.config.js'); 
var webpack = require('webpack'); 
var webpackDevMiddleware = require('webpack-dev-middleware'); 
var webpackHotMiddleware = require('webpack-hot-middleware'); 
var bodyParser = require('body-parser'); 
var MongoClient = require('mongodb').MongoClient; 
var ObjectId = require('mongodb').ObjectID; 
const jwt = require('jsonwebtoken') 

var app = express(); 
var db; 

var compiler = webpack(config); 

app.use(webpackDevMiddleware(compiler, {noInfo: true, publicPath: config.output.publicPath})); 

app.use(webpackHotMiddleware(compiler)); 

app.use(express.static('dist')); 

app.use(bodyParser.json()); 

그리고 이것은 요청이 오류가 잡힌 방법 : 그것은 오류처럼 나에게 보이는

loginUser(creds) { 
    var request = { 
     method: 'POST', 
     headers: { 
     'Accept': 'application/json', 
     'Content-Type': 'application/json' 
     }, 
     body: JSON.stringify(creds), 
    } 

    fetch(`http://localhost:3000/api/login`, request) 
    .then(res => res.json()) 
    .then(user => { 
     console.log(user); 
     console.log('Successful') 
    }) 
    .catch(err => { 
     console.log('Error is', err) 
    }) 
    }, 
+0

'user' 또는'req.body'가 정의되지 않은 것처럼 보입니다. 프로젝트에 ** bodyParser **를 포함 시켰습니까? – adeneo

+0

@adeneo 예, 원래 게시물의 수정 사항을 살펴보십시오. 존재하는 사용자 이름과 암호로 요청을 전달할 때, 올바른'user'와'req.body'가 기록되고 if 문을 입력하십시오. –

답변

1

가 발생되고있다 user이 정의되어 있지 않기 때문에이 줄에.

if(user.password === req.body.password) {...} 

콘솔 설명을 자세히 살펴보십시오.

1. Req body in login { username: 'iopsert', password: 'vset' } 
2. THIS IS WHAT WAS PASSED IN+++++ undefined 
3. User found 
4. /Users/John/practice-project/node_modules/mongodb/lib/utils.js:98 
5. process.nextTick(function() { throw err; }); 
          ^
6. TypeError: Cannot read property 'password' of null 
7. at /Users/John/practice-project/server/server.js:58:12 

라인 2 req._id이 오류가 있는지 확인하기 전에 또는 사용자가 실제로 존재하는 경우 귀하의 User found 문이 인쇄되어 undefined

것을 보여준다, 그래서 거기에 실제로 존재의 대표하지 않습니다 사용자.

줄 6은 null 개체에서 password 속성을 읽으려고하므로 오류가 발생하고 있음을 보여줍니다.

//login endpoint 
app.post('/api/login/', function(req, res) { 
    console.log('Performing login with req.body='); 
    console.log(JSON.stringify(req.body, null, 4)); 

    // check for username 
    if (!req.body.username) { 
    return res.status(401).send({message: 'No username'}); 
    } 

    // find user with username 
    db.collection('users').findOne({username: req.body.username}, function(err, user) { 

    // handle error 
    if(err) { 
     console.log('Error finding user.'); 
     return res.status(500).send({message: 'Error finding user.'}); 
    } 

    // check for user 
    if (!user) { 
     console.log('No user.'); 
     return res.status(500).send({message: 'No user.'}); 
    } 
    console.log('User found.'); 

    // check password 
    if(user.password !== req.body.password) { 
     console.log('Wrong password.'); 
     return res.status(401).send({message: 'Wrong password.'}); 
    } 

    // return user info 
    return res.status(200).send(user); 
    }); 

어떤 마지막 생각 :


내가 더이 같은보고 로그인 논리를 수정 권하고 싶습니다

  • (있는 경우) 오류를 처리 할 수 ​​있는지 확인을하고 진행하기 전에 user이 존재하는지 확인하십시오.
  • return res.status(...).send(...) 문에 항상 return을 포함하십시오. 그렇지 않으면 후속 코드가 실행됩니다.
  • 암호를 간단한 문자열로 저장하는 것은 일반적으로 좋지 않습니다. 그들을 암호화하기 위해 노력하십시오. passport 또는 bcrypt을보십시오.

희망이 도움이됩니다.

+0

미안하지만 실제로는 req._id가 존재하지 않습니다. 요청이 전달되지 않았기 때문에 그냥 무시합니다. 사용자가 실제로 데이터베이스에 존재하는 경우에도 틱 오류가 발생하지 않으므로 사용자를 찾을 수 없으면 오류 응답을 올바르게 처리하지 못한다고 가정합니다. 또한, findOne()을 수행하고 함수를 입력 할 때 이미 사용자 이름이 발견되었음을 의미하지 않습니까? 다시 사용자를 확인해야 할 필요가 있으며 'user.username'이되어서는 안됩니까? 왜 그 객체는'username'과'password'를 가지고 있지 않기 때문에'! user'가 의미하는 것은 무엇입니까? 도움을 주셔서 감사합니다. –

+0

그냥 시도해 봤지만 오류 반환은 실제로 프론트 엔드와 콘솔에서'response {'로 전달됩니다.'({message : "사용자가 없습니다})' 'catch()'함수에서'error'라고 잡았습니다. 프론트 엔드에서'catch()'함수를 잡기 위해 뭔가를 놓칠 수 있습니까? –

+0

마지막 코멘트를 보았는지 확인하기 만하면됩니다. 저에게 알려주세요. –

관련 문제