Express 错误中的数据库查询:Router.use() 需要中间件函数但未定义

Posted

技术标签:

【中文标题】Express 错误中的数据库查询:Router.use() 需要中间件函数但未定义【英文标题】:Database query in Express error: Router.use() requires a middleware function but got a undefined 【发布时间】:2019-12-22 01:52:56 【问题描述】:

我正在我的 express 应用程序中设置控制器、模型、路由和视图。修改仅使用视图的应用程序,我收到此错误: Router.use() 需要一个中间件函数,但有一个未定义的

我让它只使用 pug 视图和 server.js 文件,但是一旦我添加了模型/控制器/路由,它就会抛出这个错误。

# server.js
// http://localhost:8099/tasks
var router = express.Router();
var tasksRouter = require('./routes/tasks');
app.use('/tasks', tasksRouter.tasks_list);
# models\tasks.js
const mysql = require('mysql');

// connection configurations
const mc = mysql.createConnection(
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'mysql',
    port: '2001'
);

// connect to database
mc.connect();

module.exports = mc;
# controllers\tasksController.js
var Tasks = require('../models/tasks');

// Display list of all tasks.
exports.tasks_list = function(req, res, next) 

    mc.query('SELECT * FROM tasks', function (error, results, fields) 
     if (error) throw error;
     //console.log('The solution is: ', results);
      res.render('tasks_list', 
        title: 'Results',
        data: results
      );
    );

;
#routes\tasks.js
var express = require('express');
var router = express.Router();

// Require controller modules.
var tasks_controller = require('../controllers/tasksController');


/// ROUTES ///

// GET request for list of all tasks.
router.get('/tasks', tasks_controller.tasks_list);

module.exports = router;
#views\tasks_list.pug
extends layout

block content
  h1= title
  p Welcome to #title
    table
      for tasks in data
        tr.odd(role='row')
          td #tasks.id
          td #tasks.task
          td #tasks.status
          td.dt-body-right.sorting_1 #tasks.created_at

我应该在浏览器中显示一个将表格数据解析为 html 的页面。但在我的控制台中,我得到: c:\ExpressProject4\express-node-rest-project\node_modules\express\lib\router\index.js:458 throw new TypeError('Router.use() 需要一个中间件函数但得到一个' + gettype(fn)) ^

TypeError: Router.use() 需要一个中间件函数,但有一个未定义的函数 在 Function.use (c:\ExpressProject4\express-node-rest-project\node_modules\express\lib\router\index.js:458:13) 在功能。 (c:\ExpressProject4\express-node-rest-project\node_modules\express\lib\application.js:220:21) 在 Array.forEach () 在 Function.use (c:\ExpressProject4\express-node-rest-project\node_modules\express\lib\application.js:217:7) 在对象。 (c:\ExpressProject4\express-node-rest-project\server.js:34:5) 在 Module._compile (internal/modules/cjs/loader.js:778:30) 在 Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10) 在 Module.load (internal/modules/cjs/loader.js:653:32) 在 tryModuleLoad (internal/modules/cjs/loader.js:593:12) 在 Function.Module._load (internal/modules/cjs/loader.js:585:3)

【问题讨论】:

【参考方案1】:

您在此处引用的子属性tasks_list

app.use('/tasks', tasksRouter.tasks_list);

未在tasks/router.js 中分配-您需要重新构造导出的对象或更改require-d 时的引用方式。

【讨论】:

不确定我是否理解。我正在使用 tasks_list 告诉 tasksController.js 使用哪个路由。 tasksRouter.tasks_list 分配在哪里? 看起来我应该将 server.js 更改为 app.use('/tasks', tasksRouter); 但是现在我没有收到错误,但是在我的浏览器中,当我转到 localhost:8099/tasks 时,我得到了不能获取/任务 查看docs for app.use,我认为/tasks 路径被定义了两次——一次在路由处理程序中,一次在您注册路径时。尝试将其更改为 app.use(tasksRouter) 这是一个问题,可能是这个错误的主要问题。现在我从 tasksController.js 文件中得到一个mc is not defined。这是因为它在模型中定义,但不知道如何修复它。

以上是关于Express 错误中的数据库查询:Router.use() 需要中间件函数但未定义的主要内容,如果未能解决你的问题,请参考以下文章

Express 没有处理函数的错误 [关闭]

无法访问 express js router.delete 中的参数

express js 中的 Socket.io:Router.use 需要中间件功能但未定义

Express4.x API :Router (译)

express router和Vue router

CRUD RESTful API(Node.js,Express,Mongodb)中的删除错误