【问题标题】:Express routes: .get() requires callback functions but got a [object Object]快速路由:.get() 需要回调函数,但得到一个 [object Object]
【发布时间】:2014-02-03 04:24:04
【问题描述】:

好的,这应该很容易有人指出。

我检查了其他类似的问题,但没有任何帮助。

我正在尝试将我的所有路线移至单独的 routes.js 文件。在里面我有:

module.exports = function (app) {

  var user = {
      list : require('./routes/user.js')
    } 
  , index = {
      index : require('./routes/index.js')
    } 


  app.get('/', function(request, response){
    response.send('You made it to the home page.')
  });

  app.get('/users', user.list);
}

在我的app.js 文件中,我有这个:

var register_routes = require('./routes.js')
register_routes(app)

我的索引路由工作正常,但它在app.get('/users', user.list); 上出现此错误:

.get() 需要回调函数,但得到了一个 [object Object]

这是一款开箱即用的快递应用,因此无需过多描述。

谢谢。

编辑:根据请求,这是./routes/user.js 中的内容:

exports.list = function(req, res){
  res.send("respond with a resource");
};

【问题讨论】:

  • ./routes/user.js 长什么样子?
  • 请把代码贴在'./routes/user.js'。您只需要导出一个连接中间件函数,但您可能正在导出一个setup 类型的函数。

标签: javascript express


【解决方案1】:

您使用键 list 导出一个对象,并将您的函数作为值。

所以要访问你的函数,你需要这样做require('./routes/user.js').list

或使用您的代码user.list.list

要解决这个问题,您有两种可能性。

要么写:

var user = {
  list : require('./routes/user.js').list
}

或者:

module.exports = function(req, res){
   res.send("respond with a resource");
};

编辑

如果你的routes/user.js 以后可能会是这样的:

module.exports.list = function(req, res){
   res.send("respond with a resource");
};

module.exports.delete = function(req, res){
   res.send("delete user");
};

如果是,那么您可以在routes.js 中这样写:

var user = require('./routes/user.js');

【讨论】:

    【解决方案2】:

    我想你想要的是:

    module.exports = function (app) {
    
      var user = {
          list : function(request, response){  
                        require('./routes/user.js');
                } 
    }
        } 
      , index = {
          index : function(request, response){ 
              require('./routes/index.js') 
            }
        } 
    
    
      app.get('/', function(request, response){
        response.send('You made it to the home page.')
      });
    
      app.get('/users', user.list);
    }
    

    这样给路由一个回调,这个回调执行require。

    【讨论】:

    • 那么requestresponse应该如何在./routes/user.js中被调用呢? require('./routes/user.js'); 只包含文件然后不调用路由代码。这样请求就会超时而不做任何事情。
    • 是的,它向前迈出了一步。它不再出错,但最终超时并且什么也不做
    • 在这种情况下,我们正在尝试制作多路由文件。我们需要在 ./routes/user.js 中添加“更具体的”路由。
    【解决方案3】:

    如果您在应用程序中使用 router 来实现所有路由目的,

    var express = require('express');
    var router = express.Router();
    
    var index = require('./index');
    
    
    /* GET home page. */
    router.get('/', index.list);
    
    module.exports = router;
    

    然后在你的 index.js 文件中,就这样做

    router.list = function(req, res){
       res.send("respond with a resource"); 
    };
    

    【讨论】:

      【解决方案4】:

      在网上找了这么久,终于找到了。

      首先,你在另一个文件上实例化这样的代码,(例如:humancomms.ts):

      import express from 'express';
      
      export function shout(request: express.Request, response: express.Response, next: () => void) {
          response.send('Shout so loud!');
      }
      
      export function speak(request: express.Request, response: express.Response, next: () => void) {
          response.send('Speak less loud!');
      }
      

      这段代码到底是做什么的?没人知道。(呵呵,开个玩笑)

      这使得中间件功能与主服务器文件分离以...组织,当然。

      我们如何使用它?就像这样(在您的服务器文件中):

      const shout = require('./humancomms').shout;
      const speak = require('./humancomms').speak;
      
      app.use('/shout', shout);
      app.use('/speak', speak);
      

      此代码获取所有中间件函数并在调用某个路径时执行。

      这并不能解决所有问题,例如同一类型的多路径,好像您想调用不同强度的喊叫('/shout/high?asd=asd','/shout/low?asd=asd'),但是有是一个问题您可以尝试辅助文件:

      import express from 'express';
      
      export function shout(request: express.Request, response: express.Response, next: () => void) {
      
          if (request.path.includes('/high')) {
              response.send('Shout so loud!');
          } else if (request.path.includes('/low')) {
              response.send('Really shout?');
          }
      }
      

      看看这篇好文章:

      TypeScript Express 教程 #1。中间件、路由和控制器 (https://wanago.io/2018/12/03/typescript-express-tutorial-routing-controllers-middleware/)

      以及官方文档网站:

      编写用于 Express 应用程序的中间件 (http://expressjs.com/en/guide/writing-middleware.html)

      【讨论】:

        猜你喜欢
        • 2020-08-07
        • 2013-09-08
        • 2021-03-31
        • 2020-09-25
        • 1970-01-01
        • 1970-01-01
        • 2018-06-11
        • 2016-04-08
        • 2020-12-20
        相关资源
        最近更新 更多