You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题原因

  1. 所有async路由处理函数中的数据库异步操作未添加错误捕获逻辑,Promise被拒绝时无处理机制。
  2. connectDb()仅处理了连接成功的回调,未处理数据库连接失败的异常。
  3. 旧版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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:40:35