部署Node.js应用到Heroku后访问提示Method Not Allowed错误
问题现象
- 参照Heroku官方文档指引部署Node.js应用,依次执行
heroku create、git push heroku master命令后终端无报错 - 访问Heroku为应用分配的访问链接时,页面返回Method Not Allowed错误
贴出的项目核心代码如下:
const express = require("express"); const bodyParser = require("body-parser"); const date = require(__dirname + "/date.js"); const mongoose = require('mongoose'); const _ = require('lodash'); const app = express(); const PORT = process.env.PORT || 5000; app.set('view engine', 'ejs'); mongoose.connect('mongodb+srv://37888:commoncold@3788-j.1lyrm.mongodb.net/todolistDB'); app.use(bodyParser.urlencoded({extended: true})); app.use(express.static("public")); /* some code here*/ app.listen(PORT, function() { console.log("Server started on port ${PORT}"); });
问题根因与修复步骤
返回405 Method Not Allowed的核心原因是服务端没有匹配到浏览器访问首页时发出的GET /请求对应的处理逻辑,按以下步骤排查修复即可:
- 补全根路径GET路由
你贴出的代码在静态资源配置和端口监听之间省略了路由逻辑,这部分大概率缺了根路径的GET方法处理:浏览器访问站点默认发GET请求,如果代码里只定义了根路径的POST路由、或者完全没写根路径路由,就会直接返回405错误。把对应路由补到app.use(express.static("public"));之后、app.listen()之前即可,参考示例:app.get('/', (req, res) => { const currentDay = date.getDate(); // 替换成你自己的业务逻辑,比如查询todo数据、渲染ejs模板 Item.find({}, (err, todoItems) => { if (!err) { res.render('list', { day: currentDay, listItems: todoItems }); } }) }) - 修复现有代码的语法问题
你写的启动日志用了模板字符串语法,但外层用了双引号,变量不会被正确解析,改成反引号即可:
这个问题不会直接触发405,但会导致你查Heroku运行日志时看不到正确的启动提示,干扰后续排查。app.listen(PORT, function() { console.log(`Server started on port ${PORT}`); }); - 确认Heroku启动配置正确
检查项目根目录的package.json文件,必须配置start启动脚本,Heroku部署完成后会靠这个脚本启动你的服务,示例配置(如果你的入口文件是app.js就用这个,是index.js就对应替换文件名):{ "scripts": { "start": "node app.js" } } - 部署验证
所有修改完成后,提交代码到本地git仓库,重新执行git push heroku master完成部署。部署完成后先执行heroku logs --tail查看实时运行日志,确认服务正常启动后再访问分配的域名测试即可。
重要提醒:你贴出的代码里硬编码了MongoDB数据库的明文账号密码,立刻去MongoDB控制台重置该账号密码,后续把数据库连接串配置到Heroku的环境变量中读取,不要把敏感信息硬编码在代码里提交,避免数据库被未授权访问。
内容的提问来源于stack exchange,提问作者Baba-J
相关产品推荐
相关产品推荐

