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