【发布时间】:2016-02-01 00:18:15
【问题描述】:
作为 Javascript 开发的相对起步者,我试图了解我在构建的函数中遇到的这个问题,该函数将成为连接到 postgreSQL 数据库的代码的一部分。
在这个函数中,我使用 knex 查询构建器方法来检查远程数据库中是否存在表,该方法解析为一个布尔值,指示您指定的字符串是否与中的同名表匹配数据库。我提供了一个 knex 语法的示例示例,以便人们更好地理解该函数。
knex.schema.hasTable('users').then(function(exists) {
if (!exists) {
return knex.schema.createTable('users', function(t) {
t.increments('id').primary();
t.string('first_name', 100);
t.string('last_name', 100);
t.text('bio');
});
}
});
我试图通过使用 .every Array 方法使我的函数返回一个布尔值,该方法检查每个数组并且如果每个索引都通过定义的条件,.every 方法应该返回一个真值,否则返回假。我已经构建了一个函数,它接受一组模式键或表名,并将其传递给 .every 方法。 .every 方法然后使用 knex.schema.hasTable 方法返回 true 或 false。
我担心的是,通过函数的许多不同配置,我无法让它返回正确的值。它不仅返回一个不正确的值,这可能与.every有关,我相信它可以返回“真实”的值,但是在定义函数之后,我经常会在稍后调用它时得到一个“函数未定义”的错误文件。这是我的函数示例 - 我再次认为这是我对返回、承诺和闭包如何协同工作的理解不足,但如果有人有见识,将不胜感激。
var schemaTables = ['posts','users', 'misc'];
// should return Boolean
function checkTable() {
schemaTables.every(function(key) {
return dbInstance.schema.hasTable(key)
.then(function(exists) {
return exists;
});
});
}
console.log(checkTable(), 'checkTable function outside');
// console.log is returning undefined here, although in other situations,
I've seen it return true or false incorrectly.
【问题讨论】:
-
.every()评估同步结果并使用同步回调,它不知道如何处理结果为异步承诺的回调。基本上,你不能在这里使用.every()。
标签: node.js postgresql knex.js