简体   繁体   English

Router.use需要中间件功能吗?

[英]Router.use requires middleware function?

So I'm trying to seperate my login routes in a seperate JS file called login_routes.js 所以我试图在一个名为login_routes.js的独立JS文件中分离我的登录路由

I keep getting this specific error: 我一直收到这个特定的错误:

TypeError: Router.use() requires middleware function but got a Object at Function. TypeError:Router.use()需要中间件函数,但在Function处有一个Object。 (/Users/ethanthomas/Desktop/mean-stuff/express-server/node_modules/express/lib/router/index.js:446:13) (/Users/ethanthomas/Desktop/mean-stuff/express-server/node_modules/express/lib/router/index.js:446:13)

Not entirely understanding what it's asking me to implement ? 不完全理解它要求我implement

login_routes.js: login_routes.js:

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

app.route('/login')

.get(function(req, res, next) {
    res.send('this is the login form');
})

.post(function(req, res, next) {
    console.log('processing');
    res.send('proccessing the login form!');
});

server.js: server.js:

var express = require('express');
var app = express();
var path = require('path');
var adminRoutes = require('./app/routes/admin_routes');
var loginRoutes = require('./app/routes/login_routes');

app.use('/admin', adminRoutes);
app.use('/login', loginRoutes);


//send our index.html file to the user for the home page
app.get('/', function(req, res) {
    res.sendFile(path.join(__dirname + '/index.html'));
});

//start the server
app.listen(1337);
console.log('leet is the magic port');

Your login_routes.js should look something like this (in the context of express): 你的login_routes.js应该是这样的(在express的上下文中):

 var express = require('express'); var router = express.Router(); // GET request to /login router.get('/', function(req, res, next) { // do something }); // POST request to /login router.post('/', function(req, res, next) { // do something }); module.exports = router; 

In your app.js you use 在你的app.js中使用

 var login_routes = require('./login_routes'); ... app.use('/login', login_routes); ... 

Have a look at the code generated by the express-generator module. 看看快速生成器模块生成的代码。 That is a starting point for express webserver apps. 这是快递网络服务器应用程序的起点。

People have already offered hints at the solution in comments. 人们已经在评论中提供了解决方案的提示。

The first issue is that you need to export your "sub" app from login_routes.js . 第一个问题是您需要从login_routes.js导出“sub”应用程序。 To do so, change this: 为此,请更改此:

var app = express();

Into this: 进入:

var app = module.exports = express();

Secondly, you are—probably unintentionally—creating routes for GET /login/login and POST /login/login . 其次,您可能是无意中为GET /login/loginPOST /login/login创建路由。 To solve this, use this in login_routes.js : 要解决此问题,请在login_routes.js使用:

app.route('/').get(...).post(...);

This is because the root path in your sub app (the one in login_routes.js ) will get mapped to the path used in app.use() in your main app ( server.js ). 这是因为子应用程序中的根路径( login_routes.js的根路径)将映射到主应用程序( server.js )中app.use()中使用的路径。

Do like this: 这样做:

login_routes.js: login_routes.js:

exports.get = function( req, res ) {
  res.send('this is the login form');
};

exports.post = function( req, res ) {
  console.log('processing');
  res.send('proccessing the login form!');
};

server.js: server.js:

var loginRoutes = require('./app/routes/login_routes');

app.get('/login', loginRoutes.get);
app.put('/login', loginRoutes.post);

login_routes.js: login_routes.js:

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

app.route('/login')

.get(function(req, res, next) {
    res.send('this is the login form');
})

.post(function(req, res, next) {
    console.log('processing');
    res.send('proccessing the login form!');
});

module.exports = router;

just writ module.exports = router then it will be work 只需module.exports = router然后就可以了

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM