Express报错:Router.use()需传入中间件函数却收到字符串
Express错误排查:Router.use() requires a middleware function but got a string
错误原因及解决办法
1. 路由模块未正确导入
你的index.js中,todoRoute被定义为字符串路径"./Routes/todo-route.js",但app.use()的第二个参数需要传入Express路由对象或中间件函数,直接传字符串会触发这个类型错误。
解决办法:
将路由路径字符串改为用require()导入模块:
// 原代码 const todoRoute = "./Routes/todo-route.js"; // 修改后 const todoRoute = require("./Routes/todo-route.js");
2. 路由文件中require语法错误
todo-route.js里的require(express)缺少引号,require()函数需要接收字符串类型的模块名,这里未加引号会把express当作未定义变量,导致路由模块加载失败。
解决办法:
给模块名加上双引号:
// 原代码 const express = require(express); // 修改后 const express = require("express");
额外优化点
除了上述错误,还有两个小问题可以优化:
mongoose.connect().then(console.log("DB Connected successfuly"))会立即执行console.log,不管连接是否成功,应改为传入函数:.then(() => console.log("DB Connected successfully"))const PORT = 5000 || process.env.PORT顺序错误,应优先使用环境变量的端口,改为const PORT = process.env.PORT || 5000
修正后的完整代码
index.js
const express = require("express"); const cors = require("cors"); const mongoose = require("mongoose"); const dotenv = require("dotenv"); const todoRoute = require("./Routes/todo-route.js"); const app = express(); dotenv.config(); app.use(cors()); app.use(express.json()); mongoose .connect(process.env.MONGODB_URI, { useNewUrlParser: true, }) .then(() => console.log("DB Connected successfully")) .catch((error) => { console.log(error); }); app.get("/", (req, res) => { res.send("this is the homepage"); }); app.use("/api/todos", todoRoute); const PORT = process.env.PORT || 5000; app.listen(PORT, () => { console.log(`Listening on http://localhost:${PORT}`); });
todo-route.js
const express = require("express"); const router = express.Router(); router.get("/", (req, res) => { res.send("this is get route"); }); router.post("/", (req, res) => { res.send("this is post route"); }); router.put("/:id", (req, res) => { res.send("this is update route"); }); router.delete("/:id", (req, res) => { res.send("this is delete route"); }); module.exports = router;
内容的提问来源于stack exchange,提问作者Waleed ur Rehman
相关产品推荐
相关产品推荐

