因此,我有了一个新的 Cypress 10 项目,并且我正在尝试集成一些功能,以允许我对 Oracle 数据库进行一些基本的数据库调用(该数据库位于我可以直接访问的服务器上,而不是在本地运行) .
我一直在关注 this 指南,它展示了如何将 oracledb 包添加为 Cypress 插件,但所使用的方法(使用 /plugin 目录)在 Cypress 10 中已被弃用,因此我无法完全遵循该示例。
我尝试使用 Cypress 插件文档 作为指导来应用此逻辑,我认为我有一些几乎可以工作的东西,但我似乎无法连接到任何数据库,即使该位置位于我的 tnsnames 中。 ora 文件(尽管我直接为这个特定项目提供连接字符串)。
这是我的 cypress.config.ts 文件的样子,其中包含我创建的代码(我也在我的实现中使用了 Cucumber,因此这些引用出现在此处):
import { defineConfig } from "cypress";
import createBundler from "@bahmutov/cypress-esbuild-preprocessor";
import { addCucumberPreprocessorPlugin } from "@badeball/cypress-cucumber-preprocessor";
import createEsbuildPlugin from "@badeball/cypress-cucumber-preprocessor/esbuild";
const oracledb = require("oracledb");
oracledb.initOracleClient({ libDir: "C:\\Users\\davethepunkyone\\instantclient_21_6" });
// This data is correct, I've obscured it for obvious reasons
const db_config = {
"user": "<username>",
"password": "<password>",
"connectString": "jdbc:oracle:thin:@<hostname>:<port>:<sid>"
}
const queryData = async(query, dbconfig) => {
let conn;
try{
// It's failing on this getConnection line
conn = await oracledb.getConnection(dbconfig);
console.log("NOTE===>connect established")
return await conn.execute(query);
}catch(err){
console.log("Error===>"+err)
return err
} finally{
if(conn){
try{
conn.close();
}catch(err){
console.log("Error===>"+err)
}
}
}
}
async function setupNodeEvents(
on: Cypress.PluginEvents, config: Cypress.PluginConfigOptions ): Promise<Cypress.PluginConfigOptions> {
await addCucumberPreprocessorPlugin(on, config);
on("file:preprocessor", createBundler({
plugins: [createEsbuildPlugin(config)],
})
);
on("task", {
sqlQuery: (query) => {
return queryData(query, db_config);
},
});
return config;
}
export default defineConfig({
e2e: {
specPattern: "**/*.feature",
supportFile: false,
setupNodeEvents,
},
});
然后我得到了一些 Cucumber 代码来运行测试查询:
Then("I do a test database call", () => {
// Again this is an example query for obvious reasons
const query = "SELECT id FROM table_name FETCH NEXT 1 ROWS ONLY"
cy.task("sqlQuery", query).then((resolvedValue: any) => {
resolvedValue["rows"].forEach((item: any) => {
console.log("result==>" + item);
});
})
})
这是我的 package.json 中的依赖项:
"dependencies": {
"@badeball/cypress-cucumber-preprocessor": "^12.0.0",
"@bahmutov/cypress-esbuild-preprocessor": "^2.1.3",
"cypress": "^10.4.0",
"oracledb": "^5.4.0",
"typescript": "^4.7.4"
},
我觉得我有点走在正确的轨道上,因为当我运行上面的功能步骤时,我得到的错误是:
Error===>Error: ORA-12154: TNS:could not resolve the connect identifier specified
这让我认为它至少调用了 node-oracledb 包来生成错误,但我无法真正判断我是否犯了明显的错误(我对 JS/TS 还很陌生)。 我知道我已经引用了 Oracle 即时客户端的正确路径,并且至少已正确初始化,因为如果路径不正确,Cypress 会指出配置错误。 我知道数据库路径也有效,因为我们有一个较旧的 Selenium 实现,可以使用我提供的详细信息进行连接。
我想我只是更好奇地想知道到目前为止是否有人成功实现了与 Cypress 10 的 oracledb 连接,或者具有更多 Cypress 经验的人是否可以发现我的代码中的任何明显错误作为此特定包组合的资源似乎不存在(可能是因为 Cypress 10 相当新)。
注意:我计划改用环境变量作为数据库连接信息,这些信息最终将传递到项目中 - 我只想在解决该问题之前先让连接正常工作。
Oracle 的 C 堆栈驱动程序(例如 node-oracledb)不使用 Java,因此 JDBC 连接字符串需要更改为:
"connectString": "jdbc:oracle:thin:@<hostname>:<port>:<sid>"
如果您使用:
jdbc:oracle:thin:@mydbmachine.example.com:1521/orclpdb1
那么你的 Node.js 代码应该使用:
connectString : "mydbmachine.example.com:1521/orclpdb1"
由于您使用的是非常过时的 SID 语法,如果您无法使用服务名称,请检查 node-oracledb 手册以获取解决方案:JDBC 和 Oracle SQL Developer 连接字符串。
我使用Cypress版本10以下,它可以正常连接到Oracle,基本脚本,我将Cypress更新到版本13,它不再工作,我收到错误ORA12560,你知道如何修复它吗?