【问题标题】:app.post is not a function express nodeapp.post 不是函数表达节点
【发布时间】:2016-12-10 00:53:38
【问题描述】:

我的所有路由都在 server.js 中,但我想将其模块化并放入一个名为 routes 的文件夹中。我在 routes 文件夹中创建了一个名为 apis.js 的文件,但是当我这样做时,我得到了 TypeError: app.post is not a function

server.js:

var express    = require('express');
var app        = express();

var bodyParser = require('body-parser');
var urlencode = bodyParser.urlencoded({ extended: true});

app.use(express.static('public'));

var apis = require('./routes/apis');
app.use('/', apis);

module.exports = app;

apis.js:

  module.exports = function(app){

  app.get('/', function(req, res) {
    res.send('OK');
  });

  app.post('/idea', function(req, res) {
  ...
  });

};

另外,在 server.js 中包含 module.exports = app 很重要,因为我正在运行测试并且我每次都想要一个应用实例。

我错过了什么?

【问题讨论】:

    标签: javascript node.js express routes


    【解决方案1】:

    您需要将您的 express 应用程序传递到您的 apis 模块,以便它可以将路由附加到您的应用程序。如果您想使用app.use 将您的路由放在不同的根路径中,您可以创建另一个快速路由器,并将您的路由附加到该路由器,然后app.use 该路由器:

    server.js:

    var express    = require('express');
    var app        = express();
    
    var bodyParser = require('body-parser');
    var urlencode = bodyParser.urlencoded({ extended: true});
    
    app.use(express.static('public'));
    var apis = express.Router();
    
    require('./routes/apis')(apis);
    
    app.use('/', apis);
    module.exports = app;
    

    【讨论】:

    • 我不能用这个来做 app.use /
    • 您可以使用express.Router() 创建另一个路由器,如果您想做app.use 将它安装在不同的地方,更新我的答案
    【解决方案2】:

    更好的方法:-

    server.js

    var express    = require('express');
    var app        = express();
    
    var bodyParser = require('body-parser');
    var urlencode = bodyParser.urlencoded({ extended: true});
    
    app.use(express.static('public'));
    
    var apis = require('./routes/apis');
    app.use('/', apis);
    
    module.exports = app;
    

    apis.js :-

    var router = require('express').Router();
    router.post('/url',function(req,res,next){
     //your code 
    })
    
    module.exports = router
    

    【讨论】:

      【解决方案3】:

      有几种不同的方法可以将您的应用程序连接到您的路线,在我看来,您将它们混合在一起,导致您的错误。

      已经提到的修复...

      var router = require('express').Router();
      router.post('/url',function(req,res,next){
       //your code 
      })
      
      module.exports = router
      

      ...适用于您当前设置 server.js 文件的方式。

      另一种不需要您修改apis.js 文件的方法是在server.js 中使用

      require("./routes/apis.js")(app);
      

      而不是

      var apis = require('./routes/apis');
      app.use('/', apis);
      

      这样可以确保变量app被传递到apis.js中的函数中

      建议使用第一个版本,但希望这可以解释为什么您会在两者之间感到困惑,即因为第二个版本是替代版本。

      请参阅Differences between express.Router and app.get?,了解有关推荐路由器版本的原因的更多信息。

      【讨论】:

        猜你喜欢
        • 2015-03-04
        • 2018-07-07
        • 2018-03-28
        • 2018-03-23
        • 2021-09-20
        • 2020-07-24
        • 2021-02-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多