Node.js 为什么express.js中没有处理我的错误?
我正在学习express.js,我在想为什么我会收到未处理的PromisejectionWarning,并且在执行http api调用后没有发送错误响应 对于错误处理,我创建了助手类和中间件: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
/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,问题仍然是问题。答案是答案,而不是你的问题。因此,您可以在答案中发布您的解决方案,经过一段时间后,您甚至可以通过选择其左侧的复选标记来“接受”它,以向社区表明您的问题已经得到了回答代码>仍然不正确。