React应用启动遇UnhandledPromiseRejectionWarning问题求助
启动Node.js项目时出现未处理Promise拒绝警告及修复方案
报错信息
(node:4786) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict. (rejection id: 1) (node:4786) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
待启动服务器核心代码
const express = require('express'); const app = express(); const cors = require('cors'); const connectDb = require('./src/database'); const faker = require('faker'); const User = require('./src/models/user.model'); // configure express to use cors() // ------------------------------------------------------------------ app.use(cors()); app.get('/users', async (req, res) => { const users = await User.find(); res.json(users); }); app.get('/user-create', async (req, res) => { const user = new User({ username: faker.internet.userName(), email: faker.internet.email(), }); await user.save().then(() => console.log('User created')); res.send('User created \n'); }); app.get('/users-delete', async (req, res) => { await User.deleteMany({}).then(() => console.log('Users deleted')); res.send('Users deleted \n'); }); app.get('/', (req, res) => { res.send('Hello from Node.js app \n'); }); // start server // ----------------------- app.listen(8080, function () { console.log('Running on port 8080! - http://localhost:8080'); connectDb().then(() => console.log('MongoDb connected')); });
问题原因
- 所有
async路由处理函数中的数据库异步操作未添加错误捕获逻辑,Promise被拒绝时无处理机制。 connectDb()仅处理了连接成功的回调,未处理数据库连接失败的异常。- 旧版
faker包已废弃,当前安装版本可能与Node.js环境不兼容。
修复步骤
1. 为异步操作添加错误捕获
用try/catch块包裹所有async路由内的异步代码,捕获错误并返回客户端:
app.get('/users', async (req, res) => { try { const users = await User.find(); res.json(users); } catch (err) { console.error('获取用户失败:', err); res.status(500).send('获取用户时发生错误'); } }); app.get('/user-create', async (req, res) => { try { const user = new User({ username: faker.internet.userName(), email: faker.internet.email(), }); await user.save(); console.log('User created'); res.send('User created \n'); } catch (err) { console.error('创建用户失败:', err); res.status(500).send('创建用户时发生错误'); } }); app.get('/users-delete', async (req, res) => { try { await User.deleteMany({}); console.log('Users deleted'); res.send('Users deleted \n'); } catch (err) { console.error('删除用户失败:', err); res.status(500).send('删除用户时发生错误'); } });
2. 处理数据库连接失败
给connectDb()添加.catch()回调,捕获连接异常:
app.listen(8080, function () { console.log('Running on port 8080! - http://localhost:8080'); connectDb() .then(() => console.log('MongoDb connected')) .catch(err => console.error('数据库连接失败:', err)); });
3. 替换废弃的faker依赖
卸载旧版faker,安装官方维护的新版包:
npm uninstall faker npm install @faker-js/faker
修改代码中的引入语句:
const { faker } = require('@faker-js/faker');
4. 兼容旧课程依赖版本(可选)
若需匹配课程原环境,可指定Node.js版本(如v14或v16),并在package.json中锁定依赖版本后重新执行npm install。
内容的提问来源于stack exchange,提问作者Britnie Roach
相关产品推荐
相关产品推荐

