【问题标题】:How to call module export function from another file in javascript如何在javascript中从另一个文件调用模块导出函数
【发布时间】:2019-10-18 08:23:33
【问题描述】:

我是 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 本身。 我怎样才能得到它?

【问题讨论】:

    标签: javascript node.js module-export


    【解决方案1】:

    您不会从getUserById 返回任何内容,因此在将显式返回添加到 JavaScript 中的函数之前,调用它的结果将始终为 undefined

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

    Promises 推荐阅读:https://developers.google.com/web/fundamentals/primers/promises

    【讨论】:

      【解决方案2】:

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

      它实际上缺乏对异步过程和一般闭包的理解。

      如果你在其中添加一个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.
      };
      

      【讨论】:

      • 你对异步进程缺乏理解是对的,但是根据 User.getUserById 的定义,result 是一个回调函数,代码应该更像这样: var _check; User.getUserById(req.params.id, function(err,user){ if (!err) _check = user; console.log('res', _check)});
      • @VirgilioGM 我只是在教 OP 如何理解他的代码发生了什么。应该避免使用全局变量、混合同步和异步进程、回调和承诺。这可能需要很长时间来教。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      相关资源
      最近更新 更多