Как вызвать функцию экспорта модуля из другого файла в JavaScript - PullRequest
0 голосов
/ 02 июня 2019

Я новичок в javascript / узел JS Так что небольшая вещь о функции в JS делает меня запутанным. Здесь у меня проблема.

У меня есть функция в файле (appModel.js) с именем getUserById, которая возвращает строку из базы данных с помощью 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;

и я получаю доступ к файлу appModel через другой файл из (appRoute.js), используя

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

Я пытался получить доступ к функции getUserById в appRoute.js с помощью

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

Итак, я ожидаю, что вывод этой функции сам по себе error или user. Как я могу получить это?

Ответы [ 2 ]

0 голосов
/ 02 июня 2019

Вы ничего не возвращаете из getUserById, поэтому до тех пор, пока явное возвращение не будет добавлено к функции в JavaScript, результат его вызова всегда будет undefined.

Ваша функция result является просто обратным вызовом.Хотя оно действительно возвращает значение, оно больше не используется в getUserById или не передается чему-либо еще, главным образом потому, что вы ничего не возвращаете из своих блоков then / catch.

Рекомендуемое прочтение Обещаний: https://developers.google.com/web/fundamentals/primers/promises

0 голосов
/ 02 июня 2019

Ваша проблема не связана с модулями.

Это фактически отсутствие понимания асинхронных процессов и замыканий в целом.

Если вы добавите туда 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.
};
...