TypeError:app.use()需要中间件函数

TypeError: app.use() requires middleware functions

本文关键字:中间件 函数 app use TypeError      更新时间:2023-09-26

这是我的server.js文件和api.js文件。我在排序函数中遇到了一个错误,我打算在该函数中根据js对象的属性搜索它们。事件架构具有名称、位置、价格、评级等属性。我试着按照他们的价格分类。

server.js

var express= require('express');
var bodyParser= require('body-parser');
var morgan = require('morgan');
var config=require('./config');
var app= express();
var mongoose=require('mongoose');
//var User=require('./database/user')
mongoose.connect('mongodb://localhost:27017/db',function(err){
    if(err){
        console.log(err);
    }
    else{
        console.log("connected!");
    }
});
app.use(bodyParser.urlencoded({extended: true })); //if false then parse only strings
app.use(bodyParser.json());
app.use(morgan('dev'));//log all the requests to the console
var api=require('./app/routes/api')(app,express);
app.use('/api',api);
app.get('*',function(req,res){
    res.sendFile(__dirname + '/public/views/index.html');
});   // * means any route
app.listen(config.port,function(err){
    if(err){enter code here
        console.log(err);
    }
    else{
        console.log("The server is running");
    }
});
module.exports = router;

api.js

var User = require('../models/user');
var Event = require('../models/event');
var config = require('../../config');
var secret = config.secretKey;
module.exports = function (app, express) {
    var api = express.Router();
    app.use()
    api.post('/signup', function (req, res) {
        var user = new User({
            name: req.body.name,
            username: req.body.username,
            password: req.body.password
        });
        user.save(function (err) {
            if (err) {
                res.send(err);
                return;
            }
            res.json({
                message: 'User created!'
            });
        });
    });
    api.get('/users', function (req, res) {
        User.find({}, function (err, users) {
            if (err) {
                res.send(err);
                return;
            }
            res.json(users);
        });
    });
    api.post('/eventfeed', function (req, res) {
        var event = new Event({
            name: req.body.name,
            location: req.body.location,
            description: req.body.description,
            price: req.body.price,
            rating: req.body.rating
        });
        event.save(function (err) {
            if (err) {
                res.send(err);
                return;
            }
            res.json({
                message: 'Event created!'
            });
        });
    });
    // utility function for sorting an array by a key in alpha order
    api.get('/sortby_price', function (err) {
        if (err) return err;
            // utility function for sorting an array by a key in parsed numeric order
        else {
            function sortArrayNum(arr, key) {
                arr.sort(function (a, b) {
                    return parseInt(a[key], 10) - parseInt(b[key], 10);
                });
            }
            var dicts = EventSchema.saved;
            for (var i = 0; i < dicts.length; i++) {
                var terms = dicts[i].terms;
                sortArrayNum(terms, "price");
            }
        }
        return api;
    });
}

这是我的错误。我第一次用这个制作网页。请帮我这个错误告诉什么。

类型错误:app.use((需要中间件功能
在EventEmitter.use(c:''Users''MY APY''WebstormProjects''Main''node_modules''express''lib''application.js:209:11(
在module.exports(c:''Users''MY LAPY''WebstormProjects''Main''app''routes''api.js:10:9(
在对象处。(c:''Users''MY LAPY''WebstormProjects''Main''server.js:20:36(
在模块中_compile(module.js:460:26(
位于Object.Module_extensions..js(Module.js:478:10(
在Module.load(Module.js:355:32(
在Function.Module_load(Module.js:310:12(
位于Function.Module.runMain(Module.js:501:10(
启动时(node.js:129:16(
在node.js:814:3

我在遗漏时遇到了这个问题

module.exports = router;

在我的Routes.js中。我们需要导出所有的路由。

在我的server.js中,我有

var mainRoutes = require('./Routes.js')
app.use(mainRoutes)

因此,请检查你的"app/routes/api"文件,看看它是否有正确的导出。

中间件是一个访问应用程序请求-响应周期中的请求对象(req(、响应对象(res(和下一个中间件的函数,通常由名为next的变量表示。

中间件可以:

  • 执行任何代码
  • 对请求和响应对象进行更改
  • 结束请求-响应周期
  • 调用堆栈中的下一个中间件

如果当前中间件没有结束请求-响应周期,它必须调用next((将控制权传递给下一个中间件,否则请求将挂起。

在api.js中,行号10是无效的

app.use()

app.use必须有一个具有3个参数的函数

// a middleware with no mount path; gets executed for every request to the app
app.use(function (req, res, next) {
   console.log('Time:', Date.now());
   next();
});

如果你只想选择几个路径来使用这个中间件,你可以做一些类似的事情

// a middleware mounted on /user/:id; will be executed for any type of HTTP request to /user/:id
app.use('/user/:id', function (req, res, next) {
   console.log('Request Type:', req.method);
   next();
});
// a route and its handler function (middleware system) which handles GET requests to /user/:id
app.get('/user/:id', function (req, res, next) {
   res.send('USER');
});

看看expressjs文档,它非常好。http://expressjs.com/guide/using-middleware.html

您需要在路由文件的底部导出路由器

像这个module.exports = router;

并在app.js文件中使用

const mainRoutes = require('./Routes.js')
app.use(mainRoutes)

享受吧!

app.use要求您向它传递一个函数,然后将其用作中间件。您有两个不这样做的实例,这将导致此错误;两者都在CCD_ 3中。

api.js:10 app.use()

您没有将函数传递给.use(),因此这将导致错误。这就是你在帖子中看到的错误。

然而,你会得到另一个错误:

var api=require('./app/routes/api')(app,express);
app.use('/api',api);

本节尝试将./app/routes/api模块函数的返回值挂载为中间件。然而,我们可以在代码中看到,您实际上并没有从api.js中的函数返回值;而是从路由处理程序内部返回路由器。。

// utility function for sorting an array by a key in alpha order
api.get('/sortby_price', function (err) {
    if (err) return err;
        // utility function for sorting an array by a key in parsed numeric order
    else {
        function sortArrayNum(arr, key) {
            arr.sort(function (a, b) {
                return parseInt(a[key], 10) - parseInt(b[key], 10);
            });
        }
        var dicts = EventSchema.saved;
        for (var i = 0; i < dicts.length; i++) {
            var terms = dicts[i].terms;
            sortArrayNum(terms, "price");
        }
    }
    return api; // <- this will be returned inside the app.get call
});

相反,您应该将其从处理程序中移到函数的末尾。

修改后的代码总额如下:

module.exports = function (app, express) {
    var api = express.Router();
    ..omitted for brevity..
    // utility function for sorting an array by a key in alpha order
    api.get('/sortby_price', function (err) {
        if (err) return err;
            // utility function for sorting an array by a key in parsed numeric order
        else {
            function sortArrayNum(arr, key) {
                arr.sort(function (a, b) {
                    return parseInt(a[key], 10) - parseInt(b[key], 10);
                });
            }
            var dicts = EventSchema.saved;
            for (var i = 0; i < dicts.length; i++) {
                var terms = dicts[i].terms;
                sortArrayNum(terms, "price");
            }
        }
    });
    return api;
}

我最近遇到了同样的问题。我导出模块如下:

module.exports = { router };

删除大括号为我修复了错误。

module.exports = router;

在我的案例中,此错误是由于写入而发生的

app.use('/v1/tutorials');

而不是

 app.use('/v1/tutorials',router);

我最初的函数是app.use('/api/cars'. carRoutes),在那里我遇到了错误:

TypeError:app.use((需要中间件函数的

因为我在"api/cars"answers"carRoutes"之间有一个完整的站点。

我改成逗号,就不再碰到这个问题了。