快速路由:.get()需要回调函数但得到一个[对象]

时间:2014-01-14 22:00:38

标签: javascript express

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

我检查了其他类似的问题,没有人帮忙。

我正在尝试将所有路由移动到单独的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");
};

4 个答案:

答案 0 :(得分:18)

使用具有您的函数值的键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');

答案 1 :(得分:1)

我认为你想要的是:

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。

答案 2 :(得分:0)

如果您在应用程序中使用路由器进行所有路由,

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"); 
};

答案 3 :(得分:0)

在网上搜寻了很多时间之后,我发现了一些东西。

首先,您将这样的代码实例化到另一个文件上(例如: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)的中间件