试图包含来自其他JavaScript文件的函数,TypeError它不是函数

时间:2018-05-24 04:12:52

标签: javascript node.js

我正在努力使我的代码更清晰,将其分离到其他文件中。也就是说,我有一个UsersController.js,它将在Users数据库上执行功能。现在只有一个功能......

var User = require('../user/User');

module.exports = function(){
    this.verifyNoExistingUser = function verifyNoExistingUser(email, name){
        //check if email is taken
        User.findOne({email: email}, function(err, user){
            if(err){
                return res.status(500).send('Error on the server.');
            }
            if(!user){
                //check if username is taken
                User.findOne({name: name}, function(err, user){
                    if(err){
                        return res.status(500).send('Error on the server.');
                    }
                    if(!user){
                        return true;
                    }
                });
            }

            return false;
        });
    }
};

然后当我在我的app.js中使用它时,就像这样......

var express = require('express');
var router = express.Router();
...
var UsersController = require('../user/UsersController.js');
...
router.post('/register', function(req, res){
    var hashedPassword = bcrypt.hashSync(req.body.password, 8);

    if(!UsersController.verifyNoExistingUser(req.body.email, req.body.name)){
        console.log(val);
        return res.status(500).send("Username or email already exists.");
    }

我发现我的功能不是功能。当我打电话给...

UsersController.verifyNoExistingUser(req.body.email, req.body.name)

我特意尝试遵循此SO question但未获得正确的结果。有关如何包含其他JS文件的函数的任何帮助?

5 个答案:

答案 0 :(得分:2)

在您的热门文件中,您正在导出功能

module.exports = function(){

在您的底层文件中,您要导入该功能:

var UsersController = require('../user/UsersController.js');

并尝试访问一个属性

if(!UsersController.verifyNoExistingUser...

当然不存在。分配给函数内部的this并不会分配给函数的属性本身,即使它已经分配,​​也必须先运行该函数才能分配属性。

如果你想这样使用它,你应该导出一个对象:

var User = require('../user/User');
module.exports = {
  verifyNoExistingUser: function verifyNoExistingUser(email, name){
    //check if email is taken
    User.findOne({email: email}, function(err, user){
    // ...

但如果verifyNoExistingUser是您要导出的唯一功能,那么为什么不直接导出它,而不是导出对象?

module.exports = function verifyNoExistingUser(email, name){

答案 1 :(得分:1)

您已定义为函数并调用为对象,您可以调用函数如下

var UsersController = require('../user/UsersController.js')();

或定义为对象

var User = require('../user/User');

module.exports = {
    this.verifyNoExistingUser = function verifyNoExistingUser(email, name){

    }
};

答案 2 :(得分:0)

为什么你不写简单:

module.exports = (email, name){
    //check if email is taken
    User.findOne({email: email}, function(err, user){
        if(err){
            return res.status(500).send('Error on the server.');
        }
        if(!user){
            //check if username is taken
            User.findOne({name: name}, function(err, user){
                if(err){
                    return res.status(500).send('Error on the server.');
                }
                if(!user){
                    return true;
                }
            });
        }

        return false;
    });
};

然后在另一个文件中:

var verifyNoExistingUser = require('../user/UsersController.js');

(您可以将UsersController.js重命名为verifyNoExistingUser.js

并称之为:

verifyNoExistingUser(req.body.email, req.body.name)

答案 3 :(得分:0)

您可以这样做:

 var User = require('../user/User');

function verifyNoExistingUser(email, name){
        //check if email is taken
        User.findOne({email: email}, function(err, user){
            if(err){
                return res.status(500).send('Error on the server.');
            }
            if(!user){
                //check if username is taken
                User.findOne({name: name}, function(err, user){
                    if(err){
                        return res.status(500).send('Error on the server.');
                    }
                    if(!user){
                        return true;
                    }
                });
            }

            return false;
        });
    }
  module.exports = {
  verifyNoExistingUser,
}

答案 4 :(得分:0)

尝试

module.exports = {
    verifyNoExistingUser: function (email, name){
        //check if email is taken
        User.findOne({email: email}, function(err, user){
            if(err){
                return res.status(500).send('Error on the server.');
            }
            if(!user){
                //check if username is taken
                User.findOne({name: name}, function(err, user){
                    if(err){
                        return res.status(500).send('Error on the server.');
                    }
                    if(!user){
                        return true;
                    }
                });
            }

            return false;
        });
    }
};