Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Nodejs/express-Router.use()需要中间件函数,但得到一个'+;gettype(fn));_Javascript_Node.js_Express - Fatal编程技术网

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

Javascript Nodejs/express-Router.use()需要中间件函数,但得到一个'+;gettype(fn));,javascript,node.js,express,Javascript,Node.js,Express,我不熟悉node和express的后端开发。我正在尝试为一个简单的博客制作一个后端,其中包含帖子和用户身份验证,以便稍后在angular 4应用程序中使用 在“Posts”端,在使用chrome的插件“Postman”进行测试后,一切似乎都很好,但当我开始在“Users”端工作时,它不断抛出错误: “Router.use()需要中间件函数,但得到了'+gettype(fn));” 当我尝试运行服务器时。代码如下: app.js //Imports const express = re

我不熟悉node和express的后端开发。我正在尝试为一个简单的博客制作一个后端,其中包含帖子和用户身份验证,以便稍后在angular 4应用程序中使用

在“Posts”端,在使用chrome的插件“Postman”进行测试后,一切似乎都很好,但当我开始在“Users”端工作时,它不断抛出错误: “Router.use()需要中间件函数,但得到了'+gettype(fn));”

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

app.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);
models/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);
routes/users.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;
controllers/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;
当我使用初始化用户路由时出现问题

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

“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;
请参阅此处的快速路由器部分:

“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;
请参见此处的快速路由器部分:

是的,我刚刚输入了“return UserRouter”;我正要发布我问题的答案。非常感谢您的反馈!是的,我刚刚输入了“return UserRouter”;我正要发布我问题的答案。非常感谢您的反馈!