2

我将尝试尽可能简要地解释这一点,但问题很长(我知道)。我必须向您展示代码的结构,以便您了解为什么我需要做我绝望的尝试!

我正在开发一个使用 SQLite 作为其数据库的 Electron/AngularJS 项目。我已经安装了“node-sqlite3”npm 包,问题在于我使用了这个包的 API 之一。

有一个登录页面需要做简单的登录工作,例如检查用户提供的用户名和密码,以及存储在数据库中的用户名和密码。

为了测试,我只是检查用户名输入并在对象中返回该用户的“用户名”和“密码”;真的很简单……至少我是这么想的。

该过程包括 2 个 Angularjs 服务、一个“Login.controller”和登录页面的视图。

每一个的代码如下所示:

登录.view.html:

<md-button ng-click="vm.login(vm.username)"> Login </md-button>

vm.username是用户输入的用户名字段。

vm.login()是 Login.controller 中的一个函数。

登录.controller.js:

function LoginController($scope, authService, dbService) {

        var vm = this;

        //=== Variables ===//
        vm.username = '';

        //=== Function declarations ===//
        vm.login = login;

        //=== Function implementations ===//
        function login(username) {
            authService.authUser(username);
        }

    }

我还在这个项目中使用了“requirejs”,所以我省略了关于依赖注入和“定义”的行。控制器工作正常。

authService是负责进一步身份验证的服务,但目前没有太多内容。

dbService是连接到 SQLite 数据库并(希望稍后)执行查询并将结果返回给需要它们的其他服务/控制器的服务。

如代码所示,login()function 接受一个username参数并将数据传递给authUserfunction in authService

authService.js:

function authService(dbService) {

        // The main service object which is exposed to other components.
        var exposedObj = {
            authUser: authUser
        };

        return exposedObj;

        //=== Function implementations ===//
        function authUser(username) {
            dbService.findUser(username);
        }

    }

如您所见,此服务还连接到dbService.

authUser()login()与控制器中的函数执行相同的操作;接受用户名并将其传递给findUser()dbService. 正如我之前所说,这些只是小步骤,所以请原谅文件和服务的冗余,它们旨在稍后填充有意义的代码。

dbService.js:

function dbService() {
        .
        .
        .

        //=== Function implementations ===//
        function findUser(username) {
            var result = {};

            let sql = `SELECT username, password
                        FROM auth_user
                        WHERE username = ?;`;

            db.serialize(() => {
                db.get(sql, username, (err, row) => {
                    if (err) {
                        console.error(err);
                    }
                    result = row;
                });
            });
            return result;
        }
    }

数据库连接和其他不相关的行已被删除。这是我被困在的实际坑。

查询结果只有一行是一个对象,这就是我所追求的人。

result在顶部定义了一个对象,这是我想从findUser()函数返回的主要内容。

因此,查询的结果应该被注入到result对象中。如果发生这种情况,我可以轻松地使用findUser()之前服务 ( authService) 中的返回值并在我的代码中继续前进。

目前,该行return result自然不返回任何内容,一个空对象。node-sqlite .get()(这里) 函数是一个异步函数。因此,return result早于 执行result = row;。最终我只想填充result对象。

我不得不提到我已经尝试过 Promises,以及这里这里async/await提到的另一个解决方案。他们都没有帮助。很可能是我没有正确理解这些解决方案并错误地实施它们,但无论哪种方式,我都被这个看似简单的问题困扰了几个小时。任何帮助都非常感谢。

普里亚

** *编辑:

如果有人卡在异步调用中并一路过来,我有解决方案:dbService.js应该更改最后一个文件 ( ) 以返回一个 Promise。此示例可能会帮助您解决问题:

function findUser(username) {
            let sql = `SELECT username, password
                        FROM auth_user
                        WHERE username = ?;`;

            return new Promise((dbResolve, dbReject) => {
                db.serialize(() => {
                    db.get(sql, username, (err, res) => {
                        if (err) dbReject(err);
                        dbResolve(res);
                    });
                });
            });
        }

在你的接收端(需要这个 Promise 的结果的函数),你可以做这样的事情:

let dbPromise = dbService.findUser(username);

dbPromise
        .then((dbResolve) => {
            /* do something with the result which is inside "dbResolve" */
        })
        .catch((dbReject) => {
            console.log(dbReject);
        });
4

0 回答 0