TypeError: app.use() vereist middleware-functies

Dit is mijn server.js-bestand en api.js-bestand. Ik krijg een foutmelding in de sorteerfunctie waarin ik van plan ben de js-objecten te zoeken op basis van hun attributen. Het gebeurtenisschema heeft de attributen als naam, locatie, prijs, beoordeling. Ik heb geprobeerd het te sorteren op basis van hun prijzen.

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;
    });
}

Dit is mijn fout. Ik maak hier voor het eerst een webpagina mee. Help me alstublieft wat deze fout vertelt.

TypeError: app.use() vereist middleware-functies
op EventEmitter.use (c:\Users\MY APY\WebstormProjects\Main\node_modules\express\lib\application.js:209:11)
op module.exports (c:\Users\MY LAPY\WebstormProjects\Main\app\routes\api.js:10:9)
bij Voorwerp. (c:\Users\MY LAPY\WebstormProjects\Main\server.js:20:36)
op Module._compile (module.js:460:26)
bij Object.Module._extensions..js (module.js:478:10)
op Module.load (module.js:355:32)
bij Function.Module._load (module.js:310:12)
op Function.Module.runMain (module.js:501:10)
bij opstarten (node.js:129:16)
op node.js:814:3


Antwoord 1, autoriteit 100%

Ik had dit probleem toen ik wegging

module.exports = router;

in mijn Routes.js.We moeten alle routes exporteren.

In mijn server.js had ik

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

Controleer dus je ‘app/routes/api’-bestand om te zien of het de juiste export heeft.


Antwoord 2, autoriteit 18%

Middleware is een functie met toegang tot het request-object (req), het response-object (res) en de volgende middleware in de request-response-cyclus van de applicatie, gewoonlijk aangeduid met een variabele met de naam next.

Middleware kan:

  • Voer een willekeurige code uit.
  • Breng wijzigingen aan in het verzoek en de responsobjecten.
  • Beëindig de verzoek-antwoordcyclus.
  • Bel de volgende middleware in de stapel.

Als de huidige middleware de verzoek-antwoordcyclus niet beëindigt, moet het next() aanroepen om de controle door te geven aan de volgende middleware, anders blijft het verzoek hangen.

In api.js is regel nummer 10 ongeldig

app.use()

app.use moet een functie hebben met 3 parameters

// 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();
});

als u wilt dat slechts enkele geselecteerde paden deze middleware gebruiken, kunt u zoiets als dit doen

// 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');
});

Kijk eens naar de expressjs-documenten, het is best goed.
http://expressjs.com/guide/using-middleware.html


Antwoord 3, autoriteit 8%

U moet uw router onderaan het routebestand exporteren

zoals deze module.exports = router;

en gebruiken in app.js-bestand

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

Veel plezier!


Antwoord 4, autoriteit 5%

app.usevereist dat u een functie doorgeeft die vervolgens als middleware wordt gebruikt. Er zijn twee gevallen waarin u dit niet doet, wat deze fout zal veroorzaken; die beide in api.jsstaan.

api.js:10app.use()

Je geeft geen functie door aan .use(), en dit zal dus een fout veroorzaken. Dit is de fout die je ziet in je bericht.

U krijgt echter nog een foutmelding:

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

In deze sectie wordt geprobeerd de retourwaarde van uw ./app/routes/apimodulefunctie als middleware aan te koppelen. We kunnen echter in uw code zien dat u niet echt een waarde retourneert van de functie in api.js; in plaats daarvan retourneert u de router vanuit een route-handler..

// 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
});

U moet dit in plaats daarvan uit de handler en naar het einde van uw functie verplaatsen.

De totale gewijzigde code ziet er als volgt uit:

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;
}

Other episodes