繁体   English   中英

如何在javascript中从另一个文件调用模块导出函数

[英]How to call module export function from another file in javascript

我是javascript / node js的新手。 所以关于js中的函数的一点点让我感到困惑。 我有问题。

我在一个名为getUserById的文件(appModel.js)中有一个函数,它通过id作为参数从数据库返回一行。

User.getUserById = function getUserById(id,result){
    var koneksi = new newDb();

    koneksi.query('Select ID, email, name, status, telp_no, company_id, created_at, updated_at from user where ID = ?',id)
        .then(rows=>{
            console.log("user: ",rows);
            result(null,rows);
        })
        .catch(err=>{
            console.log('error: ',err);
            koneksi.close().then(()=>result(err,null));
        });
};

module.exports = User;

我使用来自(appRoute.js)的不同文件访问appModel文件

var User = require('../models/appModel');

我试图在appRoute.js中访问getUserById函数

var _a;
var _check = User.getUserById(req.params.id, function(err,user){
    if(err){
        _a = err;
    }else{
        _a = user;
    }
    return _a;
});
console.log('res', _check);

当我打印_check本身时,结果是res undefined

所以,我希望这个函数的输出是erroruser本身。 我怎么能得到它?

您的问题实际上与模块无关。

实际上,它通常缺乏对异步进程和闭包的理解。

如果你在下面添加一个console.log,你会发现'res'在'done'之前运行。

var _a;
var _check = User.getUserById(req.params.id, function(err,user){
    console.log('done', err, user); // <-- Add this in here.
    if(err){
        _a = err;
    }else{
        _a = user;
    }
    return _a;
});
console.log('res', _check);

关于闭包的第二部分,这里的返回值被忽略:

_check = User.getUserById(req.params.id, function(err,user){
   ... 
   return _a; // This is ignored. It will never be assigned to _check.
}

返回值实际上来自:

function getUserById(id,result){
    var koneksi = new newDb();

    ...

    return "test"; // Here. Add this last line and try again.
};

您没有从getUserById返回任何getUserById ,因此在JavaScript中向函数添加显式返回之前,调用它的结果将始终undefined

您的result函数只是一个回调。 虽然它确实返回了一个值,但该值不会在getUserById被进一步使用或传递给其他任何值,主要是因为您没有从then / catch块返回任何内容。

有关Promises的建议阅读: https//developers.google.com/web/fundamentals/primers/promises

暂无
暂无

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

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