Nodejs / express - Router.use()需要中间件功能但是得到了一个' + gettype(fn));

时间:2017-06-24 13:39:39

标签: javascript node.js express

我是使用node和express进行后端开发的新手。我试图为一个带有帖子和用户身份验证的简单博客制作一个后端,以便稍后在角度4应用程序中使用。

在"帖子"结束,经过使用chrome的插件" Postman"测试后,一切似乎都运行正常,但是当我开始使用"用户"它不断抛出错误: " Router.use()需要中间件功能但是得到了一个' + gettype(fn));"

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

app.js

curve_fit

模型/ user.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);

路由/ users.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);

控制器/ userController.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;

使用

初始化用户路由时出现问题
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;
app.js中的

1 个答案:

答案 0 :(得分:4)

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

错误来自这一行:

app.use('/api/users', userRouter);

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;

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