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

IT技术 javascript express
2021-02-26 03:32:44

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

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

我正在尝试将所有路由移动到一个单独的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个回答

您使用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');

我想你想要的是:

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

通过这种方式给路由一个回调,这个回调执行需要。

是的,它向前迈进了一步。它不再出错,但它最终超时并且什么也不做
2021-04-25 03:32:44
又应该如何requestresponse然后被称为内./routes/user.jsrequire('./routes/user.js');只包含文件然后不调用路由代码这样请求就会超时而不做任何事情。
2021-05-02 03:32:44
在这种情况下,我们正在尝试制作多路由文件。我们需要在 ./routes/user.js 中添加“更具体”的路由。
2021-05-18 03:32:44

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

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

在网上找了这么多时间后,我找到了一些东西。

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