我将尝试尽可能简要地解释这一点,但问题很长(我知道)。我必须向您展示代码的结构,以便您了解为什么我需要做我绝望的尝试!
我正在开发一个使用 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
参数并将数据传递给authUser
function 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);
});