Route.get() требует функций обратного вызова, но получил "объект Undefined",

Я учусь делать приложение Todo. На веб-сайте я изучаю это https://coderwall.com/p/4gzjqw/build-a-javascript-todo-app-with-express-jade-and-mongodb

Я набрал как инструкция описывает,

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

и я получил это сообщение об ошибке

Ошибка: Route.get() требует функции обратного вызова, но получил [объект Undefined]

Я что-то здесь упустил?

Ответ 1

В учебнике todo.all возвращается объект callback. Это требуется для синтаксиса router.get.

Из документации:

router.METHOD(обратный вызов пути, [обратный вызов,...])

Методы router.METHOD() предоставляют функцию маршрутизации в Express, где METHOD является одним из методов HTTP, таких как GET, PUT, POST и т.д., В нижнем регистре. Таким образом, фактические методы router.get(), router.post(), router.put() и т.д.

Вам по-прежнему нужно определить массив объектов callback в ваших файлах todo, чтобы вы могли получить доступ к соответствующему объекту callback для вашего router.

Из вашего учебника вы можете видеть, что todo.js содержит массив объектов callback (это то, к чему вы обращаетесь при написании 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')
    }
};

Ответ 2

Есть два маршрута для получения:

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

Ошибка: Route.get() требует функций обратного вызова, но получил [объект Undefined] Это исключение возникает, когда route.get не получает функцию обратного вызова. Поскольку вы определили todo.all в файле todo.js, но он не может найти main.index. Вот почему он работает, как только вы определяете файл main.index позже в учебнике.

Ответ 3

Убедитесь, что

yourFile.js:

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

совпадения

app.js

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

Для меня я столкнулся с этой проблемой, когда копирование вставляло модуль в другой модуль для тестирования, необходимый для изменения экспорта. xxxx в верхней части файла

Ответ 4

Некоторое время вы пропускаете ниже линии. добавь этот роутер поймет это.

module.exports = router;

Ответ 5

node js и выражение 4 используйте эти последовательности

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

module.exports = router;

последняя строка возвращает этот тип ошибки

Ответ 6

Что случилось со мной, так это то, что я экспортировал такую функцию:

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

но я звонил так:

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

вместо

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

Ответ 7

Это также произошло с моим кодом, но я решил свою проблему. Я проверил мою папку маршрутов (где все мои конечные точки их). Я бы порекомендовал вам проверить файл папки маршрутов и проверить, не забыли ли вы добавить конкретную ссылку на маршрутизатор.

Ответ 8

В моем случае я пытался "получить" из экспресс-приложения. Вместо этого я должен был сделать SET.

app.set('view engine','pug');