javascript - ReactJS + MongoDB + NodeJS/ExpressJS : What is process. nextTick(function() { throw err; });?

标签 javascript node.js mongodb express reactjs

在我的 ReactJS 项目中,我当前使用 NodeJS 和 ExpressJS 运行服务器,并使用 MongoClient 连接到 MongoDB。我设置了一个登录 API 端点,它接受使用用户用户名和密码的请求。如果未找到用户,则应捕获错误并向前端响应错误 (status(500))。

但是服务器并没有用 json 错误响应前端,而是崩溃了。我已经尝试了一切来找出原因,但仍然没有运气。

如何修复以下错误?任何指导或见解将不胜感激,并将投票并接受答案。

我故意使用数据库中不存在的用户名和密码 ({ 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,
      })
    }
  })

这是终端错误日志:

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 指的是以下内容:

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

第 2 行显示 req._id 未定义

在检查是否存在错误或用户是否实际存在之前,会打印您的 Userfound 语句,因此它并不代表实际存在用户。

第 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,否则后续代码将执行。
  • 将密码保存为简单字符串通常不是一个好主意。努力对它们进行加密。看passportbcrypt .

希望这有帮助。

关于javascript - ReactJS + MongoDB + NodeJS/ExpressJS : What is process. nextTick(function() { throw err; });?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40029444/

相关文章:

node.js - 当我使用 .find() 时,是什么导致 mongodb shell 不显示所有记录?

javascript - 如何在D3中的节点链接图中绘制多条自边

javascript - Facebook 登录按钮没有显示在我的博客上

node.js - 如何使用 jenkins 构建后发布到另一个 git

node.js - 如何在环回中创建模型之间的多对多关系?

node.js - 客户端socket.io和服务器端socket.id不同

java - MongoDB:java中的提示索引

mongodb - 在 mongodb 中拆分日期

Javascript将正则表达式存储在变量中

javascript - react 应用程序 : Undefined value after fetch