Node.js 为什么express.js中没有处理我的错误?

Node.js 为什么express.js中没有处理我的错误?,node.js,express,mongoose,error-handling,Node.js,Express,Mongoose,Error Handling,我正在学习express.js,我在想为什么我会收到未处理的PromisejectionWarning,并且在执行http api调用后没有发送错误响应 对于错误处理,我创建了助手类和中间件: /helpers/errorHander.js ------------------------------------ class ErrorHandler extends Error { constructor(statusCode, message) { super(); thi

我正在学习express.js,我在想为什么我会收到未处理的PromisejectionWarning,并且在执行http api调用后没有发送错误响应

对于错误处理,我创建了助手类和中间件:

/helpers/errorHander.js
------------------------------------
class ErrorHandler extends Error {
  constructor(statusCode, message) {
    super();
    this.statusCode = statusCode;
    this.message = message;
  }
}

const handleError = (err, res) => {
  const { statusCode, message } = err;
  res.status(statusCode).json({
    status: 'error',
    statusCode,
    message
  });
};

module.exports = {
  ErrorHandler,
  handleError
};
我已在app.js文件中启用此中间件:

/app.js
------------------------------------
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const config = require('./config/init');
const cors = require('cors');
const { handleError, ErrorHandler } = require('./helpers/errorHandler');

//routes
const apiRoutes = require('./api');

// connect db
config.initializeDB();

// configure bodyParser
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

// Enable Cors
app.use(cors());

// Set Routes
app.use('/', apiRoutes);

app.get('/error', (req, res) => {
  throw new ErrorHandler(500, 'Internal server error');
});

// Enable error handling middleware
app.use((err, req, res, next) => {
  handleError(err, res);
});

module.exports = app;
当我对/error端点执行请求时,它工作正常: 但是,当对使用mongoose执行操作的端点执行请求时,我没有得到期望的结果:

user.route.js:

const router = require('express').Router();
const userController = require('./user.controller');

router.get('/', userController.getUsers);
router.post('/', userController.createUser);

module.exports = router;

user.controller.js:

const userService = require('../../../services/user');

module.exports = {
  getUsers: (req, res, next) => {
    return res.json(userService.getUsers());
  },
  createUser: (req, res, next) => {
    const username = req.body.username;
    const password = req.body.password;
    res.json(userService.createUser(username, password));
  }
};
const userService = require('../../../services/user');

module.exports = {
  getUsers: (req, res, next) => {
    return res.json(userService.getUsers());
  },
  createUser: async (req, res, next) => {
    const username = req.body.username;
    const password = req.body.password;
    try {
      let user = await userService.createUser(username, password);
    } catch (err) {
      next(err);
    }
  }
};
user.service.js:

const User = require('../models/user');
const { ErrorHandler } = require('../helpers/errorHandler');

module.exports = {
  getUsers: async () => {
    return User.find({});
  },
  createUser: async (username, password) => {
    const user = new User({ username, password });
    try {
      await user.save();
      return user;
    } catch (err) {
      if (err.code === 11000) {
        throw new ErrorHandler(409, 'Username already exists!');
      }
      throw new ErrorHandler(500, 'Internal server error');
    }
  }
};

控制台会发出这样的警告:

为什么它没有按我想要的那样工作,我如何才能使它工作

========================================================= 更新#1 正如user-jfriend00所建议的,我试图等待承诺,这里我的代码在user.controller.js上看起来像:

const userService = require('../../../services/user');

module.exports = {
  getUsers: (req, res, next) => {
    return res.json(userService.getUsers());
  },
  createUser: (req, res, next) => {
    const username = req.body.username;
    const password = req.body.password;
    res.json(userService.createUser(username, password));
  }
};
const userService = require('../../../services/user');

module.exports = {
  getUsers: (req, res, next) => {
    return res.json(userService.getUsers());
  },
  createUser: async (req, res, next) => {
    const username = req.body.username;
    const password = req.body.password;
    try {
      let user = await userService.createUser(username, password);
    } catch (err) {
      next(err);
    }
  }
};

现在我得到了想要的结果

user.service.js
中,您的
createUser()
函数是
async
。这意味着,当您将抛出时,它将返回一个被拒绝的承诺。但是,在
user.controller.js
中调用
userService.createUser()
,操作如下:
res.json(userService.createUser(username,password))
将永远无法工作,因为
userService.createUser()
返回最终将解决或拒绝的承诺。它不直接返回值。您需要
让result=等待userService.createUser()
,并确保您也处理了可能被拒绝的承诺。谢谢!我已经更新了post,它现在可以在等待createUser方法,然后将错误对象传递给next()中间件时工作。也许你有一些建议,我怎样才能使代码库变得更好?仅供参考,这里是stackoverflow,问题仍然是问题。答案是答案,而不是你的问题。因此,您可以在答案中发布您的解决方案,经过一段时间后,您甚至可以通过选择其左侧的复选标记来“接受”它,以向社区表明您的问题已经得到了回答仍然不正确。在
user.service.js
中,您的
createUser()
函数是
async
。这意味着,当您将抛出时,它将返回一个被拒绝的承诺。但是,在
user.controller.js
中调用
userService.createUser()
,操作如下:
res.json(userService.createUser(username,password))
将永远无法工作,因为
userService.createUser()
返回最终将解决或拒绝的承诺。它不直接返回值。您需要
让result=等待userService.createUser()
,并确保您也处理了可能被拒绝的承诺。谢谢!我已经更新了post,它现在可以在等待createUser方法,然后将错误对象传递给next()中间件时工作。也许你有一些建议,我怎样才能使代码库变得更好?仅供参考,这里是stackoverflow,问题仍然是问题。答案是答案,而不是你的问题。因此,您可以在答案中发布您的解决方案,经过一段时间后,您甚至可以通过选择其左侧的复选标记来“接受”它,以向社区表明您的问题已经得到了回答仍然不正确。