Nodejs/express - Router.use() 需要中间件函数,但得到了 ' + gettype(fn));

Cri*_*koC 1 javascript node.js express

我是 Node 和 Express 后端开发的新手。我正在尝试为一个简单的博客创建一个后端,其中包含帖子和用户身份验证,以便稍后在 Angular 4 应用程序中使用。

在“帖子”端,使用 chrome 插件“Postman”进行测试后,一切似乎都工作正常,但是当我开始在“用户”端工作时,它不断抛出错误:“Router.use() 需要中间件功能,但得到了a ' + gettype(fn));"

当我尝试运行服务器时。代码如下:

应用程序.js

//Imports
const express       = require('express');
const path          = require('path');
const bodyParser    = require('body-parser');
const mongo         = require('mongodb');
const mongoose      = require('mongoose');
const passport      = require('passport');
const cors          = require('cors');
const config        = require('./config/database');

//initialize App
var app = express();

//Setting port
var port = 3000;

//initialize cors
app.use(cors());

//Set static folder
app.use(express.static(path.join(__dirname,'../client/src')));

//initialize body parser
app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());

//Root route
app.get('/', function(req,res) {
    res.send('Welcome to my API');
});

//Listen to port
app.listen(port, function () {
    console.log('Server is running on post: ' + port);
});

//connection to DB
mongoose.connect(config.database);

mongoose.connection.on('connected', function () {
    console.log('Connected to database' + config.database);
});

mongoose.connection.on('error', function (err) {
    console.log('Database error' + err);
});

//Models
var Post = require('./models/post');
var User = require('./models/user');

//Routes
var postRouter = require('./routes/posts')(Post);
var userRouter = require('./routes/users')(User);

//Initialize routes
app.use('/api/posts', postRouter);
app.use('/api/users', userRouter);
Run Code Online (Sandbox Code Playgroud)

模型/user.js

 var mongoose = require('mongoose');

    var Schema = mongoose.Schema;

    var userModel = new Schema({
        name:       {type: String},
        email:      {type: String, required:true},
        username:   {type: String, required:true},
        password:   {type: String, required:true}
    });

    module.exports = mongoose.model('Users',userModel);
Run Code Online (Sandbox Code Playgroud)

路线/user.js

var express = require('express');
var passport = require('passport');
var jwt = require('jsonwebtoken');

var userRoutes = function(User) {
    var UserRouter = express.Router();

    var userController = require('../controllers/userController')(User);

    //Register
    UserRouter.route('/register').post(userController.post);
    //Authenticate
    UserRouter.route('/authenticate').get();
    //Profile
    UserRouter.route('/profile').get();
};

module.exports = userRoutes;
Run Code Online (Sandbox Code Playgroud)

控制器/userController.js

var userController = function(User) {

    var post = function(req,res) {
        var bcrypt = require('bcryptjs');

        //creating new instance of model and pass the bodyParser
        var user = new User(req.body);

        if(!req.body.username) {
            res.status(400);
            res.send('Name is required');
        }
        else if (!req.body.password) {
            res.status(400);
            res.send('Password is required');
        }
        else if (!req.body.email) {
            res.status(400);
            res.send('Email is required');
        }
        else {
            bcrypt.hash(user.password, function (err, hash) {
                user.password = hash;
            });
            //saving in db
            user.save();
            //status 201 means created
            res.status(201);
            //send result
            res.send(user);
        }
    };

    return {
        post: post
    };
};

module.exports = userController;
Run Code Online (Sandbox Code Playgroud)

当我用以下命令初始化用户路由时出现问题

app.use('/api/users', userRouter);
Run Code Online (Sandbox Code Playgroud)

在app.js中

Gat*_*ill 5

“Router.use() 需要中间件功能,但得到了 ' + gettype(fn));”

错误来自这一行:

app.use('/api/users', userRouter);
Run Code Online (Sandbox Code Playgroud)

app.use 需要一个路径和一个中间件函数。这里您返回一个简单的函数,而不是中间件,这就是您收到错误的原因。

在routes/users.js中你只需要返回express.Router中间件函数。

var express = require('express');
var passport = require('passport');
var jwt = require('jsonwebtoken');

var userRoutes = function(User) {
    var UserRouter = express.Router();

    var userController = require('../controllers/userController')(User);

    //Register
    UserRouter.route('/register').post(userController.post);
    //Authenticate
    UserRouter.route('/authenticate').get();
    //Profile
    UserRouter.route('/profile').get();

    // UserRouter is a middleware function
    return UserRouter;
};

module.exports = userRoutes;
Run Code Online (Sandbox Code Playgroud)

请参阅此处的快速路由器部分: http: //expressjs.com/en/guide/routing.html