繁体   English   中英

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

[英]Trying to include functions from other JavaScript files, TypeError that it's not a function

我正在尝试使我的代码更清晰,将其分离到其他文件中。 也就是说,我有一个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)

我特意试图遵循这个问题,但没有得到正确的结果。 有关如何包含其他JS文件的函数的任何帮助?

在您的顶级文件中,您正在导出一个函数

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){

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

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

或定义为对象

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

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

    }
};

为什么你不简单地写:

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)

你可以这样做:

 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,
}

尝试

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;
        });
    }
};

暂无
暂无

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

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