Route.get()需要回调函数,但得到了一个“未定义的对象”

时间:2016-04-11 20:45:25

标签: node.js express

我正在学习制作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()需要回调函数,但得到了一个[对象   未定义]

我在这里错过了什么吗?

14 个答案:

答案 0 :(得分:14)

在教程中,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')
    }
};

答案 1 :(得分:4)

get有两条路线:

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

错误:Route.get()需要回调函数但得到[对象未定义] route.get没有获得回调函数时抛出此异常。由于您已在todo.js文件中定义了todo.all,但无法找到main.index。 这就是为什么一旦你在教程中定义main.index文件就可以了。

答案 2 :(得分:3)

我遇到了同样的错误。 调试后,我发现我拼错了从控制器导入到路由文件中的方法名称。 请检查方法名称。

答案 3 :(得分:2)

确保

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 :(得分:2)

有时您会错过以下行。添加此路由器将了解这一点。

module.exports = router;

答案 5 :(得分:1)

节点js和express 4 使用此序列

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

module.exports = router;

最后一行返回此类错误

答案 6 :(得分:1)

我有同样的错误。问题出在模块的导出和导入。

我的解决方案示例:

控制器(文件:posts.js)

exports.getPosts = (req, res) => {
    res.json({
        posts: [
            { tittle: 'First posts' },
            { tittle: 'Second posts' },
        ]
    });
};

路由器(文件:posts.js)

const express = require('express');
const { getPosts } = require('../controllers/posts');

const routerPosts = express.Router();
routerPosts.get('/', getPosts);

exports.routerPosts = routerPosts;

主要(文件:app.js)

const express = require('express');
const morgan = require('morgan');
const dotenv = require('dotenv');
const { routerPosts } = require('./routes/posts');

const app = express();
const port = process.env.PORT || 3000;

dotenv.config();

// Middleware
app.use(morgan('dev'));

app.use('/', routerPosts);

app.listen(port, () => {
    console.log(`A NodeJS API is listining on port: ${port}`);
});

运行应用程序(chrome输出)

// 20200409002022
// http://localhost:3000/

{
  "posts": [
    {
      "tittle": "First posts"
    },
    {
      "tittle": "Second posts"
    }
  ]
}

控制台日志

jmendoza@jmendoza-ThinkPad-T420:~/IdeaProjects/NodeJS-API-Course/Basic-Node-API$ npm run dev

> node-api@1.0.0 dev /home/jmendoza/IdeaProjects/NodeJS-API-Course/Basic-Node-API
> nodemon app.js

[nodemon] 2.0.3
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node app.js`
A NodeJS API is listining on port: 3000
GET / 304 5.093 ms - -
GET / 304 0.714 ms - -
GET / 304 0.653 ms - -
[nodemon] restarting due to changes...
[nodemon] starting `node app.js`
A NodeJS API is listining on port: 3000
GET / 200 4.427 ms - 62
GET / 304 0.783 ms - -
GET / 304 0.642 ms - -

节点版本

jmendoza@jmendoza-ThinkPad-T420:~/IdeaProjects/NodeJS-API-Course/Node-API$ node -v
v13.12.0

NPM版本

jmendoza@jmendoza-ThinkPad-T420:~/IdeaProjects/NodeJS-API-Course/Node-API$ npm -v
6.14.4

答案 7 :(得分:1)

检查模型中的结束标记,可能是您在另一个回调中定义了一个回调

答案 8 :(得分:0)

发生了什么事,我正在导出这样的函数:

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

但是我这样称呼它:

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

代替

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

我希望可以帮助某人!

答案 9 :(得分:0)

这件事也发生在我的代码中,但是以某种方式我解决了我的问题。我检查了路由文件夹(所有端点都在其中)。我建议您检查自己的路由文件夹文件,并检查是否忘记添加特定的路由器链接。

答案 10 :(得分:0)

就我而言,我试图从Express应用程序中“获取”。相反,我必须执行SET。

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

答案 11 :(得分:0)

我的问题是导入错误:

我将函数导入到router/index.js中,如下所示:

const { index } = require('../controllers');

并像这样使用它:

router.get('/', index.index);

这是我的错误。我一定使用过:

router.get('/', index);

所以我将其更改为上面的行,问题得到解决。

答案 12 :(得分:0)

(1)确保已在路由器文件中导入了相应的控制器文件

(2)确保在router.get()文件的router.post()router.js中写入的函数名称与在相应的控制器文件中写入的函数名称完全相同< / p>

(3)确保您已经写过 module.exports=router;文件底部的router.js

答案 13 :(得分:-1)

我的建议,如果您在使用 module.exports 导出多个函数时仍然使用 const XXX = require('library or path./') 使用 ES6 箭头函数

例如:

module.exports = () => {

const  getPosts = (req, res ) =>{
    res.send('THIS WORKS!');
}

const getPost = async (req, res) => { 
    const { id } = req.params;

    try {
        const post = await PostMessage.findById(id);
        
        res.status(200).json(post);
    } catch (error) {
        res.status(404).json({ message: error.message });
    }
}

}

然后导入: const getPosts = require('../controllers/posts.js');

希望这会有所帮助...干杯! www.miyamotto.net