【问题标题】:Router.use() requires a middleware function but got a undefined .how solve this problem?Router.use() 需要一个中间件函数,但有一个未定义的。如何解决这个问题?
【发布时间】:2020-12-27 12:37:21
【问题描述】:

我已经使用 node.js 编写了一个 CRUD。我需要使用另一个节点项目作为微服务。所以我使用 axios npm 模块向另一个节点项目发送 http 请求。当我运行代码时,再次出现以下错误再一次。如何解决它。 这是我的 index.js 文件

const axios = require('axios').default;
const express=require('express');

const bodyParser=require('body-parser');
const mysqlConnection=require('./connections');
const cors = require('cors');
mysqlConn = mysqlConnection.startDBConnection();
// console.log(mysqlConn);



var app=express();
app.use(bodyParser.json());

const emp=require('./routes/employee')(express.Router(), mysqlConn);

app.use('/employeeDetails',emp);


app.listen(3001,()=>console.log('express server is working at port:3001'));

这是路由文件。 员工.js

const apiAdapter = require('./apiAdapter');

const BASE_URL = 'http://localhost:3000';
const api = apiAdapter(BASE_URL);



module.exports = (router, mysqlConnection) => {

router.get('/employees/:id', (req, res) => {
    mysqlConnection.query('SELECT * FROM Employee WHERE Id = ?', [req.params.Id], (err, rows, fields) => {
               if (!err)
                   res.send(fields);
               else
                   console.log(err);
            }) 

api.get('/checkAudtStatus',req.body)
.then(respond)
{

if(respond.data===true)
{
api.post('/createAuditRecord',req.body)
.then(respond)
{
res.send(res.data)
}
}
}  
})




router.post('/employees',(req,res)=>{

    emp = {
       "Id":req.body.Id,
       "Name":req.body.Name,
       "Age":req.body.Age,
       "Salary":req.body.Salary,
       "City":req.body.City 
    }
    mysqlConnection.query("INSERT INTO Employee SET ?",emp, function(err, result){
        //  //If err, callback false
        if(err){
            res.send(false);
            // res.send(false);
        }
        else{
            res.send(result);
        }
    })
    api.get('/checkAuditStatus',req.body)
    .then(respond)
    {
    
    if(respond.data===true)
    {
    api.post('/createAuditRecord',req.body)
    .then(respond)
    {
    res.send(res.data)
    }
    }
    } 
})
}

这是 apiAdapter.js

const axios = require('axios');

module.exports = (baseURL) => {
    //allowing to handle other micro-services' urls by gateway
    return axios.create({
        baseURL: baseURL,
    });
}

这是connection.js

var mysql = require('mysql');

//startDBConnection method
function startDBConnection(){
    try{
        
        var mysqlConnection = mysql.createPool({
            host: 'localhost',
            user: 'root',
            connectionLimit:10,//port:'8080',
            password: '',
            database: 'Test',
            //multipleStatements: true
        });
       

        return mysqlConnection;
    }
    catch(e){
        console.log(e);
    }
}

module.exports.startDBConnection = startDBConnection;

运行上述代码时出现以下错误。

[nodemon] app crashed - waiting for file changes before starting...
[nodemon] restarting due to changes...
[nodemon] starting `node index.js`
/home/naoda/Documents/test_/node_modules/express/lib/router/index.js:458
      throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn))
      ^

TypeError: Router.use() requires a middleware function but got a undefined
    at Function.use (/home/naoda/Documents/test_/node_modules/express/lib/router/index.js:458:13)
    at Function.<anonymous> (/home/naoda/Documents/test_/node_modules/express/lib/application.js:220:21)
    at Array.forEach (<anonymous>)
    at Function.use (/home/naoda/Documents/test_/node_modules/express/lib/application.js:217:7)
    at Object.<anonymous> (/home/naoda/Documents/test_/index.js:17:5)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
[nodemon] app crashed - waiting for file changes before starting...

【问题讨论】:

    标签: javascript node.js json express microservices


    【解决方案1】:

    执行app.use(bodyParser.json()); 时找不到bodyParser.json() 的值 以便尝试执行 app.use(bodyparser.urlencoded({extended:false})); 执行前 app.use(bodyParser.json());

    【讨论】:

      【解决方案2】:

      在这两行代码中:

      const emp=require('./routes/employee')(express.Router(), mysqlConn);
      
      app.use('/employeeDetails',emp);
      

      emp 需要是一个中间件函数(或者路由器也将作为一个中间件函数工作)。但是,当您查看员工模块的详细信息时,您会导出一个函数,该函数在调用时不会返回任何内容。所以,empundefined。可能,您需要从emp 返回的是您要添加路由的路由器。

      看来您的api.get().then() 代码的声明方式也存在问题。结合这两个修复,将是这样的:

      const apiAdapter = require('./apiAdapter');
      
      const BASE_URL = 'http://localhost:3000';
      const api = apiAdapter(BASE_URL);
      
      module.exports = (router, mysqlConnection) => {
          router.get('/employees/:id', (req, res) => {
              mysqlConnection.query('SELECT * FROM Employee WHERE Id = ?', [req.params.Id], (err, rows, fields) => {
                  if (!err) {
                      res.send(fields);
                  } else {
                      // send some sort of error status
                      console.log(err);
                      res.sendStatus(500);
                      return;
                  }
              });
      
              api.get('/checkAudtStatus', req.body).then(respond => {
                  if (respond.data === true) {
                      api.post('/createAuditRecord', req.body).then(res => {
                          res.send(res.data);
                      });
                  }
              });
          });
          return router;
      }
      

      其他同样需要修复的不相关问题:

      1. 如果该承诺被拒绝,api.get() 没有错误处理程序
      2. 您有一个代码路径,您将尝试调用res.send() 两次以获得相同的请求。一次在您的mysqlConnnection.query() 的回调中,一次在api.get().then().then() 处理程序中
      3. api.post().then() 存在同样的声明问题。

      【讨论】:

      • 感谢您的回复,我非常支持我
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 2015-04-17
      • 1970-01-01
      • 2017-10-20
      • 2019-04-21
      • 2019-12-23
      相关资源
      最近更新 更多