web-dev-qa-db-fra.com

Route.get () nécessite des fonctions de rappel mais possède un "objet non défini"

J'apprends à faire Todo app. Sur le site Web, j'étudie est https://coderwall.com/p/4gzjqw/build-a-javascript-todo-app-with-express-jade-and-mongodb

J'ai tapé comme 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 () nécessite des fonctions de rappel mais a un [objet indéfini]

Ai-je raté quelque chose ici?

21
jayko03

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

De la documentation:

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

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

Vous devez toujours définir le tableau d'objets callback dans vos fichiers todo pour pouvoir accéder à l'objet callback approprié pour votre objet router.

Vous pouvez voir dans votre tutoriel que todo.js contient le tableau de callback objets (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')
    }
};
18
roflmyeggo

Il existe deux itinéraires pour obtenir:

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

Erreur: Route.get () nécessite des fonctions de rappel mais a un [objet non défini] Cette exception est levée lorsque route.getne reçoit pas de fonction de rappel. Comme vous avez défini todo.all dans le fichier todo.js, il est impossible de trouver main.index. C'est pourquoi cela fonctionne une fois que vous définissez le fichier main.index plus tard dans le tutoriel.

4
Nivesh

Quelque temps vous manquez sous la ligne. ajouter ce routeur comprendra cela.

module.exports = router;
2
Yogesh Shetty

Sois sûr que

votreFichier.js:

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

allumettes

app.js

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

Pour moi, je me suis heurté à ce problème lorsque copier/coller un module dans un autre module pour le tester a nécessité de modifier les exportations. xxxx en haut du fichier

2
Nick

noeud js et express 4 utilisent cette séquence

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

module.exports = router;

la dernière ligne renvoie ce type d'erreur

1
Anshu Verma

Cette chose s'est également produite avec mon code, mais j'ai quand même résolu mon problème. J'ai vérifié mon dossier d'itinéraires (où mes tous les noeuds finaux sont les leurs). Je vous recommande de vérifier le fichier de votre dossier de routes et de vérifier si vous avez oublié d’ajouter votre lien de routeur particulier.

0
Kuldeep Sharma

Ce qui m'est arrivé, c’est que j’exportais une fonction comme celle-ci:

module.exports = () => {
    const method = async (req, res) => {
    }
    return {
        method
    }
}

mais je l'appelais comme ça:

const main = require('./module');

au lieu

const main = require('./module')();
0
jack.the.ripper

Dans mon cas, j'essayais d'obtenir de l'application express. Au lieu de cela, je devais faire SET.

app.set('view engine','pug');
0
Raghavendra M