Express项目中出现Router.use()需传入中间件函数却收到字符串的TypeError问题求助
解决Express项目中的TypeError: Router.use()错误
嘿,我来帮你搞定这个Express项目里的错误!先理清楚问题出在哪:
你的项目依赖版本
{ "dependencies": { "body-parser": "^1.19.0", "ejs": "^3.1.5", "express": "^4.17.1" } }
原始代码
//jshint esversion:6 const express=require("express"); const bodyparser=require("body-parser"); const app=express(); app.use("view engine","ejs"); app.get("/",function(req,res){ var dati= new date(); var day=""; if(dati.getdate()>0 && dati.getdate()<6) { day="weekday"; res.render("list.ejs",{ab: day}); } res.send(); }); app.listen(3000,function(){ console.log("server started at 3000"); });
出现的错误信息
throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn))
^
TypeError: Router.use() requires a middleware function but got a string
错误原因拆解
核心问题:视图引擎配置方法用错了
你用app.use("view engine","ejs")来配置EJS,但app.use()是用来注册中间件函数的,它只接受中间件函数(或路径+中间件函数)作为参数,传入两个字符串肯定会报错。正确设置视图引擎的方式是用app.set()。JavaScript大小写失误
JS是严格区分大小写的:new date()→ 要写成new Date()(构造函数首字母必须大写)dati.getdate()→ 要改成dati.getDate()(方法名首字母大写)
重复响应请求
在if分支里你已经用res.render()发送了响应,但后面又调用res.send(),这会触发Cannot set headers after they are sent to the client错误——一个HTTP请求只能对应一次响应输出。
修复后的完整代码
//jshint esversion:6 const express = require("express"); const bodyParser = require("body-parser"); const app = express(); // 正确设置EJS为视图引擎 app.set("view engine", "ejs"); // 解析表单请求体(后续处理POST请求会用到) app.use(bodyParser.urlencoded({ extended: true })); app.get("/", function(req, res) { const date = new Date(); let day = ""; // getDay()返回0(周日)到6(周六),工作日是1-5 if (date.getDay() > 0 && date.getDay() < 6) { day = "weekday"; } else { day = "weekend"; // 补充周末的判断逻辑 } // 只发送一次响应 res.render("list", { ab: day }); }); app.listen(3000, function() { console.log("server started at 3000"); });
额外小优化
- 补充了周末的判断逻辑,让页面能完整显示工作日/周末状态
- 加上了
bodyParser的表单解析配置,方便后续处理POST请求 - 把变量名改成了更易懂的
date,提升代码可读性
内容的提问来源于stack exchange,提问作者akshit gupta
相关产品推荐
相关产品推荐

