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

Nka*_*kav 5 javascript node.js

这是我的server.js文件和api.js文件.我在sort函数中遇到错误,我打算根据它们的属性搜索js对象.事件Schema具有名称,位置,价格,评级等属性.我试着根据它们的价格对它进行排序.

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;
Run Code Online (Sandbox Code Playgroud)

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;
    });
}
Run Code Online (Sandbox Code Playgroud)

这是我的错误.我是第一次使用这个网页.请帮助我这个错误告诉我什么.

TypeError:app.use()需要
在module.exports(c:\ Users )的EventEmitter.use(c:\ Users\MY APY\WebstormProjects\Main \node_modules\express\lib\application.js:209:11)
中的中间件函数\ MY LAPY\WebstormProjects\Main\app\routes\api.js:10:9)
at Object.(c:\ Users\MY LAPY\WebstormProjects\Main\server.js:20:36)
在Module._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)
启动时(节点. js:129:16)
在node.js:814:3

小智 14

我离开时遇到了这个问题

module.exports = routers
Run Code Online (Sandbox Code Playgroud)

在我的Routes.js中

在我的server.js中,

var mainRoutes = require('./Routes.js')
app.use(mainRoutes)
Run Code Online (Sandbox Code Playgroud)

因此,请检查您的“ app / routes / api”文件以查看其是否具有正确的导出功能。


Riy*_*rve 5

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

中间件可以:

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

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

在api.js中,第10行无效

app.use()
Run Code Online (Sandbox Code Playgroud)

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();
});
Run Code Online (Sandbox Code Playgroud)

如果你只想要几个选定的路径来使用这个中间件,你可以做这样的事情

// 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');
});
Run Code Online (Sandbox Code Playgroud)

看一下expressjs文件,这是非常好的. http://expressjs.com/guide/using-middleware.html

  • app.use不需要3个参数。它只需要具有您想要使用的参数即可。如果您不希望向下游传递参数,则可以轻松省略`next`。OP的最大问题,除了他的app.use()错误外,还在于他的外部模块不返回中间件,而是将其安装在他的主文件中。 (2认同)

Hap*_*tel 5

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

像这样 module.exports = router;

并在 app.js 文件中使用

const mainRoutes = require('./Routes.js')
app.use(mainRoutes)
Run Code Online (Sandbox Code Playgroud)

享受!