在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
相关产品推荐
相关产品推荐

