9 votes

Route.get() requiert des fonctions de rappel mais obtient un "objet indéfini".

J'apprends à créer une application Todo. Sur le site web que j'étudie, il y a https://coderwall.com/p/4gzjqw/build-a-javascript-todo-app-with-express-jade-and-mongodb

J'ai tapé comme le décrit l'instruction,

[app.js]
var main = require('./routes/main');
var todo = require('./routes/todo');
var todoRouter = express.Router();
app.use('/todos', todoRouter);
app.get('/', main.index);
todoRouter.get('/',todo.all);
todoRouter.post('/create', todo.create);
todoRouter.post('/destroy/:id', todo.destroy);
todoRouter.post('/edit/:id', todo.edit);

[/routes/todo.js]
module.exports ={
  all: function(req, res){
    res.send('All todos');
  },
  viewOne: function(req, res){
    console.log('Viewing '+req.params.id);
  },
  create: function(req, res){
    console.log('Todo created');
  },
  destroy: function(req, res){
    console.log('Todo deleted');
  },
  edit: function(req, res){
    console.log('Todo '+req.params.id+' updated');
  }
};

et j'ai eu ce message d'erreur

Erreur : Route.get() requiert des fonctions de rappel mais a obtenu un [objet indéfini].

J'ai raté quelque chose ?

11voto

roflmyeggo Points 979

Dans le tutoriel, le todo.all renvoie un callback objet. Ceci est nécessaire pour le router.get la syntaxe.

Dans la documentation :

router.METHOD(chemin, [callback, ...] callback)

Les méthodes router.METHOD() fournissent la fonctionnalité de routage en Express, où METHOD est l'une des méthodes HTTP, telles que GET, PUT, POST, et ainsi de suite, en minuscules. Ainsi, les méthodes actuelles sont router.get(), router.post(), router.put(), et ainsi de suite.

Vous devez encore définir le tableau de callback dans votre todo afin que vous puissiez accéder aux fichiers appropriés callback pour votre router .

Vous pouvez voir dans votre tutoriel que todo.js contient le tableau des callback (c'est ce à quoi vous accédez lorsque vous écrivez todo.all ) :

module.exports = {
    all: function(req, res){
        res.send('All todos')
    },
    viewOne: function(req, res){
        console.log('Viewing ' + req.params.id);
    },
    create: function(req, res){
        console.log('Todo created')
    },
    destroy: function(req, res){
        console.log('Todo deleted')
    },
    edit: function(req, res){
        console.log('Todo ' + req.params.id + ' updated')
    }
};

4voto

Nivesh Points 1681

Il y a deux voies pour obtenir :

app.get('/', main.index);
todoRouter.get('/',todo.all);

Erreur : Route.get() requiert des fonctions de rappel mais a obtenu un [objet indéfini]. Cette exception est déclenchée lorsque route.get ne reçoit pas de fonction de rappel. Comme vous avez défini todo.all dans le fichier todo.js, mais il est incapable de trouver main.index. C'est pourquoi il fonctionne une fois que vous avez défini le fichier main.index plus loin dans le tutoriel.

1voto

Nick Points 1210

Assurez-vous que

votreFichier.js :

exports.yourFunction = function(a,b){
  //your code
}

correspond à

app.js

var express = require('express');
var app = express();
var yourModule = require('yourFile');
app.get('/your_path', yourModule.yourFunction);

En ce qui me concerne, j'ai rencontré ce problème lorsque j'ai copié-collé un module dans un autre module pour le tester, j'ai dû modifier les exports. xxxx en haut du fichier.

1voto

Anshu Verma Points 18

Node js et express 4 utiliser ces séquences

express = require('express');
var router = express.Router();

module.exports = router;

la dernière ligne renvoie ce type d'erreur

1voto

Yogesh Shetty Points 11

Parfois, vous manquez la ligne du bas. Ajoutez ce routeur et vous le comprendrez.

module.exports = router;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X