簡體   English   中英

Router.use() 需要一個中間件函數,但是得到了一個 undefined 。如何解決這個問題?

[英]Router.use() requires a middleware function but got a undefined .how solve this problem?

我已經使用 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...

執行app.use(bodyParser.json()); 找不到bodyParser.json()的值,因此嘗試執行app.use(bodyparser.urlencoded({extended:false})); 在執行app.use(bodyParser.json());

在這兩行代碼中:

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()一次在.then()用於處理api.get().then()
  3. api.post().then()相同的聲明問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM