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

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


错误原因拆解

  1. 核心问题:视图引擎配置方法用错了
    你用app.use("view engine","ejs")来配置EJS,但app.use()是用来注册中间件函数的,它只接受中间件函数(或路径+中间件函数)作为参数,传入两个字符串肯定会报错。正确设置视图引擎的方式是用app.set()。

  2. JavaScript大小写失误
    JS是严格区分大小写的:

    • new date() → 要写成new Date()(构造函数首字母必须大写)
    • dati.getdate() → 要改成dati.getDate()(方法名首字母大写)
  3. 重复响应请求
    在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 06:12:30