TypeError: app.use() necesită funcții middleware (Programare, Javascript, Node.Js)

Nkav a intrebat.

Acesta este fișierul meu server.js și fișierul api.js. Primesc o eroare în funcția de sortare în care intenționez să caut obiectele js în funcție de atributele lor.Schema evenimentului are atributele ca nume, locație, preț, rating. Am încercat să le sortez în funcție de prețurile lor.

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

Aceasta este eroarea mea. Fac o pagină web pentru prima dată folosind acest lucru. Vă rog să mă ajutați ce spune această eroare.

TypeError: app.use() necesită funcții middleware
at EventEmitter.use (c:UsersMY APYWebstormProjectsMain
ode_modulesexpresslibapplication.js:209:11)
at module.exports (c:UsersMY LAPYWebstormProjectsMainapproutesapi.js:10:9)
at Object. (c:UsersMY LAPYWebstormProjectsMainserver.js:20:36)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Function.Module.runMain (module.js:501:10)
at startup (node.js:129:16)
at node.js:814:3

Comentarii

  • Ați văzut stackoverflow.com/questions/31496100/…? –  > Por Nikola B..
4 răspunsuri
CM3

Am avut această problemă atunci când am omis

module.exports = router;

în Routes.js.Trebuie să exportăm toate rutele.

În server.js al meu, am avut

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

Deci, verificați fișierul ‘app/routes/api’ pentru a vedea dacă are exportul corespunzător.

Riyaz Parve

Middleware este o funcție cu acces la obiectul de cerere (req), la obiectul de răspuns (res) și la următorul middleware din ciclul cerere-răspuns al aplicației, denotat în mod obișnuit printr-o variabilă numită next.

Middleware poate:

  • Să execute orice cod.
  • Să aducă modificări la obiectele request și response.
  • Să încheie ciclul cerere-răspuns.
  • să apeleze următorul middleware din stivă.

În cazul în care middleware-ul curent nu încheie ciclul cerere-răspuns, trebuie să apeleze next() pentru a transfera controlul către următorul middleware, în caz contrar cererea va fi lăsată în așteptare.

În api.js, linia numărul 10 nu este validă

app.use()

app.use trebuie să aibă o funcție cu 3 parametri

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

dacă doriți ca doar câteva căi selectate să utilizeze acest middleware, puteți face ceva de genul următor

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

Aruncați o privire la documentele expressjs, care sunt destul de bune.http://expressjs.com/guide/using-middleware.html

Comentarii

  • app.use nu trebuie să aibă 3 parametri. Trebuie să aibă doar parametrii pe care vă interesează să îi folosiți… Puteți să omiteți cu ușurință next dacă nu vă interesează să treceți în aval. Cea mai mare problemă a lui OP, în afară de defecțiunea lui app.use(), , este și faptul că modulul său extern nu returnează un middleware, dar acesta este montat în fișierul său principal. –  > Por Dan.
  • mulțumesc pentru informații Sunt la fel de nou în node.js. –  > Por Riyaz Parve.
Dan

app.use necesită să îi treceți o funcție care este apoi folosită ca middleware. Aveți două cazuri în care nu faceți acest lucru, ceea ce va cauza această eroare; ambele sunt în api.js.

api.js:10 app.use()

Nu treceți o funcție către .use(), și, prin urmare, acest lucru va cauza o eroare. Aceasta este eroarea pe care o vedeți în mesajul dvs.

Cu toate acestea, veți obține o altă eroare:

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

Această secțiune încearcă să monteze valoarea de returnare a funcției dvs. ./app/routes/api funcția modulului ca un middleware. Cu toate acestea, putem vedea în interiorul codului dvs. că, de fapt, nu returnați o valoare din funcția din api.js; în schimb, returnați routerul din interiorul unui gestionar de traseu..

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

În schimb, ar trebui să mutați acest lucru în afara gestionarului și la sfârșitul funcției dvs.

Codul total modificat va arăta astfel:

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

Comentarii

  • Am eliminat aceste erori. A fost vina mea. Nu am văzut asta, dar când deschid /api/sortby_price nu răspunde și când am făcut debugging, nici măcar nu intră în funcție. Care ar putea fi eroarea? –  > Por Nkav.
  • @bob, am dat înapoi această editare deoarece modificarea pe care ai făcut-o la primul bloc de cod nu ar fi funcționat cu codul lui OP așa cum este. Cu toate acestea, a doua modificare pe care ai făcut-o, în care ai eliminat „app” din module.exports, a fost în regulă. Vă rog să nu ezitați să adăugați din nou acest lucru. –  > Por Dan.
Happy Patel

Trebuie să exportați routerul dvs. în partea de jos a fișierului de rută

astfel module.exports = router;

și să îl utilizați în fișierul app.js

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

Bucurați-vă!

Comentarii

  • Acesta este exact ceea ce îmi lipsea. Vă mulțumesc foarte mult! –  > Por Big Sam.
  • Asta mă ajută și pe mine, mulțumesc. –  > Por M_abosalem.