gpt4 book ai didi

node.js - this.parent.acquire 不是预处理语句的函数

转载 作者:搜寻专家 更新时间:2023-10-31 23:56:38 68 4
gpt4 key购买 nike

我为我的数据库使用 mssql ( https://www.npmjs.com/package/mssql ) 模块。通常我使用导致 pg ( https://www.npmjs.com/package/pg ) 的 postgres 数据库。

我想为 mssql 数据库设置准备好的语句。使用 pg 模块时,这很容易。


这就是我用 pg 做的:

我设置了我的databaseManager

const { Pool } = require('pg');
const db = require('../config/database.js');
const pool = new Pool(db);

function queryResponse(result, err) {
return {
result,
err
};
}

module.exports = async (text, values) => {
try {
const result = await pool.query(text, values);
return queryResponse(result.rows, null);
} catch (err) {
return queryResponse(null, err);
}
};

每当我想查询数据库时,我都可以调用这个模块并传入我的语句和值。待办事项应用的一个例子是

todos.js(查询文件)

const db = require('../databaseManager.js');

module.exports = {
getAllTodosFromUser: values => {
const text = `
SELECT
id,
name,
is_completed AS "isCompleted"
FROM
todo
WHERE
owner_id = $1;
`;

return db(text, values);
}
};

我想创建一个 mssql 等效项。从文档中我看到该模块与 pg 模块不同。

我将 databaseManager 更改为

const sql = require('mssql');
const config = require('../config/database.js');
const pool = new sql.ConnectionPool(config).connect();

module.exports = async (queryBuilder) => {
try {
const preparedStatement = await new sql.PreparedStatement(pool);

return queryBuilder(sql, preparedStatement, async (query, values) => {
await preparedStatement.prepare(query);
const result = await preparedStatement.execute(values);
await preparedStatement.unprepare();

return {
result: result.rows,
err: null
};
});
} catch (err) {
return {
result: null,
err
}
}
};

我的查询文件会为 preparedStatement 对象传递所需的参数

const db = require('../databaseManager.js');

module.exports = {
getUserByName: username => db((dataTypes, statementConfigurator, processor) => {
statementConfigurator.input('username', dataTypes.VarChar);

const query = `
SELECT
*
FROM
person
WHERE
username = @username;
`;

return processor(query, { username });
})
};

我希望这种方法能返回所需的结果,但我得到了错误

this.parent.acquire is not a function

不知道我的代码是不是错了。如果是,我该如何正确设置准备好的语句?


编辑:

刚发现错误出自这行代码

await preparedStatement.prepare(query);

但我认为我从文档中得到的是正确的

https://tediousjs.github.io/node-mssql/#prepared-statement

最佳答案

我认为这个问题比 OP 给出的答案更值得解释。解决方案与 OP 已经回答的没有什么不同。

问题仍然存在,池一定没有从其 promise pending 状态中解决。所以只能等待。

module.exports = async queryBuilder => {
try {
await pool; // Waiting for pool resolve from promise pending state.
const preparedStatement = await new sql.PreparedStatement(pool);
// ..
} catch (err) {
// ..
}
};

当您尝试构建准备好的语句时,您将池作为参数传递给它的构造函数。在它的构造函数中是下面的 line

this.parent = parent || globalConnection

然后,当您准备语句时,流程将导向此 line这会导致问题,因为当时 this.parent 的值仍然是一个尚未解决的 promise 。

this.parent.acquire(this, (err, connection, config) => {

关于node.js - this.parent.acquire 不是预处理语句的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55690245/

68 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com