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

在Netlify部署Node.js遇404问题:user路由端点无法访问

Express + Netlify 端点404问题修复

问题

运行netlify dev时,src/user/routes.js中的/test和/create端点返回404错误,本地开发与Netlify生产部署均无法正常访问这些端点。

项目目录结构

|---.git
|---.gitignore
|---src
|   |---user
|   |   |---controller.js  (忽略此文件)
|   |   |---routes.js
|   |---app.js
|   |---config.js
|   |---routes.js
|---.env.dev.sample
|---package.json

各文件内容

src/user/routes.js

import express from 'express';
import { create } from './controller.js';

const router = express.Router();

router.get('/create', create);

router.get('/test', (req, res) => {
  res.send("Test page for netlify hosting");
});

export default router;

src/app.js

import express from 'express';
import cors from 'cors';
import { APP_PORT } from './config.js';
import router from './routes.js';
import serverless from 'serverless-http';

const app = express();

app.listen(APP_PORT, () => {
  console.log(`Server is running on port ${APP_PORT}`);
});

app.use(express.json({ limit: '5mb' }));
app.use(cors());

app.use('/api/v1', router);

app.use((req, res, next) => {
   res.status(404).json('The requested resource was not found on this server');
});

export default serverless(app);

src/config.js

import dotenv from 'dotenv';
import { fileURLToPath } from 'url';
import { dirname } from 'path';
import path from 'path';

const envConfigFile = process.env;

if (envConfigFile.NODE_ENV !== 'prod') {
    const __filename = fileURLToPath(import.meta.url);
    const __dirname = dirname(__filename);
    
    const configFile = path.resolve(__dirname, '../.env.sample');
    dotenv.config({ path: configFile, encoding: 'utf-8' });
}

const { APP_PORT } = envConfigFile;

export { APP_PORT };

src/routes.js

import { Router } from 'express';
import userRoutes from './user/routes.js';

const router = Router();

router.use('/user', userRoutes);

export default router;

.env.dev.sample

APP_PORT = "yourAppPort"

package.json

{
    "version": "1.0.0",
    "description": "",
    "type": "module",
    "engines": {
        "node": "20.18.0",
        "npm": "10.8.2"
    },
    "main": "src/app.js",
    "scripts": {
        "start": "cross-env NODE_ENV=prod node src/app.js",
        "devStart": "cross-env NODE_ENV=dev nodemon src/app.js"
    },
    "author": "",
    "license": "",
    "homepage": "",
    "devDependencies": {
        "cross-env": "7.0.3",
        "nodemon": "3.1.9"
    },
    "dependencies": {
        "cors": "2.8.5",
        "dotenv": "16.4.7",
        "express": "4.21.2",
        "serverless-http": "^3.2.0"
    }
}

修复方案

1. 修正端点访问路径

用户路由挂载在/api/v1/user下,正确的端点URL应为:

  • /api/v1/user/test
  • /api/v1/user/create
    直接访问/test或/create会触发404。

2. 添加Netlify配置文件

在项目根目录创建netlify.toml,配置函数路径与路由重定向:

[build]
  functions = "functions"

[[redirects]]
  from = "/api/*"
  to = "/.netlify/functions/api/:splat"
  status = 200

3. 调整src/app.js适配Serverless环境

移除app.listen()调用(Serverless环境无需启动HTTP服务器),并修改导出格式:

import express from 'express';
import cors from 'cors';
import router from './routes.js';
import serverless from 'serverless-http';

const app = express();

// 移除app.listen
// app.listen(APP_PORT, () => {
//   console.log(`Server is running on port ${APP_PORT}`);
// });

app.use(express.json({ limit: '5mb' }));
app.use(cors());

app.use('/api/v1', router);

app.use((req, res, next) => {
   res.status(404).json('The requested resource was not found on this server');
});

// 导出符合Netlify要求的handler
export const handler = serverless(app);

4. 修正环境变量文件路径

src/config.js中加载的文件路径错误,改为指向.env.dev.sample:

const configFile = path.resolve(__dirname, '../.env.dev.sample');

5. 优化本地开发命令

在package.json中添加netlify dev启动命令:

"scripts": {
    "start": "cross-env NODE_ENV=prod node src/app.js",
    "dev": "netlify dev",
    "devStart": "cross-env NODE_ENV=dev nodemon src/app.js"
}

完成以上修改后,运行netlify dev,访问http://localhost:8888/api/v1/user/test即可正常返回内容。部署到Netlify后,生产环境URL格式为https://your-site.netlify.app/api/v1/user/test。

内容的提问来源于stack exchange,提问作者John6602

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 02:08:14