ReactJS + MongoDB + NodeJS / ExpressJS: что такое process.nextTick (function () {throw err;}) ;?

В моем проекте ReactJS я в настоящее время запускаю сервер с NodeJS и ExpressJS и подключаюсь к MongoDB с помощью MongoClient. У меня есть конечная точка API входа в систему, которая принимает запрос со статусом (500): {имя пользователя: «iopsert», пароль: «vser») и // login endpoint app.post ('/ api / login /', function (req, res) {console.log ('Req body in login', req.body) console.log («ЭТО ЧТО ПРОИСХОДИЛО В +++++», req._id) db.collection («пользователи») findOne ( {username: req.body.username}, function (err, user) {console.log («Пользователь найден») if (err) {console.log («ЭТО ОШИБКА ОТВЕТ») // Хочет отправить этот json как ответ об ошибке на front-end res.status (500) .send ({ошибка: «Это ответ об ошибке», успех: false,})} if (user.password === req.body.password) { console.log («Имя пользователя и пароль верны») res.status (500) .send ({имя пользователя: req.body.username, success: true, user: user,})} else {res.status (500). send ({error: «Credentials are wrong», success: false,})}}). И если пользователь не найден, следует поймать ошибку и ответить с ошибкой (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 ) к интерфейсу.

Но вместо того, чтобы реагировать на внешний интерфейс с ошибкой json, сервер разбивается. Я пробовал все, чтобы понять, почему, но до сих пор не повезло.

Как я могу исправить следующую ошибку? Любые указания или проницательность будут оценены с большой благодарностью и будут отвечать и принимать ответ.

Я намеренно сделал запрос с именем пользователя и паролем ( /Users/John/practice-project/node_modules/mongodb/lib/utils.js:98), который не существует в базе данных.

Вот конечная точка входа:

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;
}

И вот журнал ошибок терминала:

"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) }) }, имеет в виду следующее:

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

javascript,node.js,mongodb,express,reactjs,

0

Ответов: 1


1

Мне кажется, что ошибка возникает в этой строке, потому что userне определена.

undefined

Посмотрите на свои консольные заявления.

User found

Строка 2 показывает, что req._id 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); }); заявление печатается до того, как вы проверите, есть ли ошибка или действительно ли пользователь существует, поэтому он не является представителем того, что на самом деле есть пользователь.

Строка 6 показывает, что ошибка возникает, потому что вы пытаетесь прочитать свойство passwordиз нулевого объекта.


Я бы рекомендовал изменить логику входа в систему, чтобы больше походить на это:

user

Некоторые последние мысли:

  • Обязательно обработайте ошибку (если она существует) и проверьте, userсуществует ли это до начала.
  • Всегда включайте returnв свои return res.status(...).send(...)заявления, иначе последующий код будет выполнен.
  • Как правило, не рекомендуется сохранять пароли как простые строки. Работайте над их шифрованием. Посмотрите на паспорт или bcrypt .

Надеюсь это поможет.

JavaScript, Node.js, MongoDB, экспресс, reactjs,