app.post不是一个函数,它与Express Node相关。

5
我把所有的路由都放在了 server.js 文件中,但我想要让它更加模块化并将其放入名为 routes 的文件夹中。我在 routes 文件夹中创建了一个名为 apis.js 的文件,但是当我这么做时,出现了“TypeError: app.post 不是函数”的错误。
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 是很重要的,因为我正在运行测试,并且我希望每次都有一个 app 实例。
我错过了什么吗?
3个回答

9
更好的方法:-
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

0

连接应用程序和路由的方法有几种不同的方式,看起来您正在将它们混合在一起,导致了错误。

已经提到的解决方案...

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

module.exports = router

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

另一种不需要修改apis.js文件的方法是在server.js中使用require引入它。

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

而不是

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

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

建议使用第一个版本,但希望这能解释为什么你会在两个版本之间感到困惑,即因为第二个是备选版本。

有关为什么推荐路由器版本的更多信息,请参见 express.Router 和 app.get 之间的区别?


0

您需要将您的Express应用程序传递到apis模块中,以便它可以将路由附加到您的应用程序上。如果您想使用app.use将路由放置在不同的根路径中,则可以创建另一个Express路由器,并将您的路由附加到该路由器上,然后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;

我无法使用这个for /进行app.use。 - fscore
如果你想在不同的位置使用app.use来挂载路由器,可以使用express.Router()创建另一个路由器。我已经更新了我的答案。 - dtkaias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接