0

我是 javascript/node 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;

我通过来自(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本身。我怎么能得到那个?

4

2 回答 2

0

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

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

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

于 2019-06-02T16:51:08.963 回答
0

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

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

如果您在其中添加一个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.
};
于 2019-06-02T15:11:29.730 回答