- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在将 Bookshelf 和 Knex 集成到我的堆栈中时遇到了一些问题。尝试执行数据库读/写时,出现类型错误:knex 不是函数。
我的书架.js:
'use strict'
var knex = require('knex')(require('./knexfile')).debug(true);
var bookshelf = require('bookshelf')(knex);
bookshelf.plugin('registry');
module.exports = bookshelf;
我的 god.model.js:
var bookshelf = require('./bookshelf');
var God = bookshelf.Model.extend({
tableName: 'gods'
});
module.exports = bookshelf.model('God', God);
最后,获取数据的函数:
var validate_key_secret = function(key, secret, callback) {
God.where({apikey: key}).fetch().then(function(result) {
if(result.attributes.apisecret === secret) {
callback(results);
} else {
callback(false);
}
});
}
调用该函数会抛出以下错误:
TypeError: bookshelf.knex 不是函数 在 builderFn [as _builder] (D:\Repositories\knextest\node_modules\bookshelf\lib\bookshelf.js:314:27) 在 Object.query (D:\Repositories\knextest\node_modules\bookshelf\lib\helpers.js:44:23) 在查询 (D:\Repositories\knextest\node_modules\bookshelf\lib\model.js:1243:30) 在哪里 (D:\Repositories\knextest\node_modules\bookshelf\lib\model.js:1278:23) 在 Function.Model.(匿名函数).Collection.(匿名函数) [as where] (D:\Repositories\knextest\node_modules\bookshelf\lib\bookshelf.js:333:28) 在 validate_key_secret (D:\Repositories\knextest\app\controllers\gods.server.controller.js:114:3) 在 Layer.handle [作为 handle_request] (D:\Repositories\knextest\node_modules\express\lib\router\layer.js:95:5) 在接下来 (D:\Repositories\knextest\node_modules\express\lib\router\route.js:131:13) 在 Route.dispatch (D:\Repositories\knextest\node_modules\express\lib\router\route.js:112:3) 在 Layer.handle [作为 handle_request] (D:\Repositories\knextest\node_modules\express\lib\router\layer.js:95:5) 在 D:\Repositories\knextest\node_modules\express\lib\router\index.js:277:22 在 Function.process_params (D:\Repositories\knextest\node_modules\express\lib\router\index.js:330:12) 在接下来 (D:\Repositories\knextest\node_modules\express\lib\router\index.js:271:10) 在 SessionStrategy.strategy.pass (D:\Repositories\knextest\node_modules\passport\lib\middleware\authenticate.js:325:9) 在 SessionStrategy.authenticate (D:\Repositories\knextest\node_modules\passport\lib\strategies\session.js:71:10)
到目前为止我尝试了什么:
1) 调查 bookshelf.js Node 模块。错误发生在 ./node_modules/bookshelf/lib/bookshelf.js 第 314 行:
builder = bookshelf.knex(tableNameOrBuilder);
当我将行更改为时,
builder = bookshelf.knex.select().from(tableNameOrBuilder);
我能够执行简单的 sql 读写。但是,这开始导致更复杂的查询出现问题,我认为编辑 Node 模块通常不是好的做法。但是,这样做确实排除了我的 knexfile/db 配置可能出现的任何问题。
2) 在循环依赖错误的情况下集成 bookshelf.plug('registry')
。
3) 检查 knex 文档。 Knex(tablename) 是查询构建器的一部分,应该可以工作。所以我补充说,
knex('gods');
到我的 bookshelf.js 文件的末尾,它抛出了一个类似的 [knex 不是函数] 错误。
我认为问题可能是 knex 模块未正确加载,但我不确定如何检查是否属于这种情况。目前,我有点难过。
如果以上任何内容不清楚,我深表歉意,我对 Node 和 javascript 开发仍然很陌生,很乐意提供有助于解决此问题的任何其他信息。
谢谢!
编辑:
Knexfile.js:
module.exports = {
client: 'pg',
connection: {
host: '<my cloud host [redacted]>',
user: process.env.DBUSER,
password: process.env.DBPASSWORD,
database: '<my db name [redacted]>'
}
};
最佳答案
这个很棘手。该问题是由 .debug(true)
knex 调用引起的,该调用不返回 knex 实例。所以把 bookshelf.js
改成
'use strict'
var knex = require('knex')(require('./knexfile'));
knex.debug(true);
var bookshelf = require('bookshelf')(knex);
bookshelf.plugin('registry');
module.exports = bookshelf;
与其以这种方式强制 Debug模式,还不如从 knex 连接字符串中设置它,例如:
{
client: 'pg',
connection: {
host: '<my cloud host [redacted]>',
user: process.env.DBUSER,
password: process.env.DBPASSWORD,
database: '<my db name [redacted]>'
},
debug: true
}
关于javascript - Bookshelf.knex 不是函数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42520339/
knex.raw(sql, bindings)和 knex.schema.raw(statement) . 似乎这两个函数具有不同的签名。 如果它们相等,我该如何使用 knex.schema.raw(
我有一些 Knex 迁移脚本,如下所示: 'use strict'; exports.up = function (knex) { return knex.schema .ha
我希望基本上在 Knex 中进行此类查询,但我无法使其正常工作: select distinct * from ( select *, 1 as rank from table1 where Wo
我想为 Knex 迁移中的主键设置默认值,但我遇到了问题。这是我最初的迁移: exports.up = (knex, Promise) => { return knex.schema.create
我发现有两种方法可以在迁移文件中编写 knex 迁移。 exports.up = function (knex) { return knex.schema .createTable
我正在使用 MSSQL,我有一个存储过程返回多个结果集(1 个用于数据,1 个用于记录计数)当我使用 knex.raw 调用此存储过程时,Knex 仅返回第一个结果集。如何使用 Knex + Node
我有一个表,当向其中添加新行时,所有现有行都需要更新。本质上,在一个“插入”完成之前,我不想让另一个“插入”发生。 所以我猜普通的行级锁或读锁是不够的,想在事务期间直接锁表。 有没有办法在 Knex
我正在尝试使用以下代码在迁移脚本中将列数据类型从日期修改为时间戳 knex.schema.alterTable('user', function(t) { t.timestamp('bifthda
我的 Knex 驱动程序出现间歇性错误: TimeoutError: Knex: 获取连接超时。游泳池可能已经满了。你错过了一个 .transacting(trx) 调用吗? 我猜,要么是我的 RDS
我有以下路线,我想获取与从第一个查询获得的 id 关联的总和 app.post('/VerEmpresas', function (req, res) { var r, dot, ide; k
在How to return a plain value from a Knex / Postgresql query? ,我询问了如何从 Knex 查询中获取列值,而没有包含列名的 JSON 对象。
我对 knex(和 node js)很陌生。如果存在,我需要编写插入,但我无法执行此操作。 下面不起作用,但有没有办法做到这一点? var val = "water"; knex('ingredien
有没有办法使用 Kenx 将 IF 语句添加到 SELECT 查询?假设我要执行以下查询: SELECT id, name, IF(grade<60,'Fail','Pass') AS examRes
我有一个关于 SQL 连接池的问题。我的团队正在我们的 Node 应用程序之一中使用 knex.js 库来进行数据库查询。应用程序不时需要切换数据库。因此,我的团队创建了一个初始化函数,该函数返回配置
我刚刚接触 knex,遇到了事务。我认为它很有用,因为它具有回滚功能。尝试使用它(参见下面的代码) await knex.transaction(trx => { knex.raw(delete fr
我正在为 Mysql 使用 Knex.js。我运行迁移并成功创建表。之后,当我通过此命令命令 knex seed:run 运行种子时,出现以下错误: Knex:warning - calling kn
我通过以下方式将 order by 绑定(bind)添加到 knex 原始查询。 -- Here userIds = [1,2,3] and dataOrder='DESC' knex.raw.que
尝试针对我的远程 postgres 数据库(不是本地主机)运行 knex seed:run 时出现以下错误:Knex:Error Pool2 - Error: connect ECONNREFUSED
我要在一个函数中对数据库执行五 (5) 项操作。我想将它们放入事务中,但我发现将每个都放入前一个操作的回调中有点奇怪。我怎样才能以优雅和可读的方式做到这一点? 最佳答案 Knex 具有内置的事务支持,
我正在尝试使用 Knex.js 查询生成器构建数据库迁移,但是我收到以下与外键关系相关的错误: Knex:warning - migrations failed with error: alter t
我是一名优秀的程序员,十分优秀!