@existdb/node-exist

中文文档
8.0.0发布于 2026/09/13MITES Module构建来源已验证近 30 天下载 3000

与 eXist DB 的 XML- RPC API 基于承诺的交互

中文使用文档
文档目录23 节
  1. 安装
  2. 使用
  3. 资源
  4. XML - RPC 相机
  5. 连接选项
  6. 含有默认值的 REST 客户端
  7. 默认的 XmlRpc 客户端
  8. 实例
  9. 从环境读取选项
  10. 构成部分
  11. 查询
  12. 文档
  13. 资源
  14. 收款
  15. 应用
  16. 指数
  17. 用户
  18. 服务器
  19. 命令行脚本
  20. 测试
  21. 路线图
  22. 兼容性
  23. 免责声明

节点性别

semantic release status js-standard-style

主要是浅薄的包装 eXist 的 XML- RPC API 财务报告和审定财务报表 (原始内容存档于2013-10-12). eXist's REST API。 。 。 . 试图将名词翻译为节点世界. 用承诺.

安装

npm install @existdb/node-exist

注: 如果您正在寻找命令行客户端, 请查看 页:1

使用

除了eXist-db的XML-RPC API外,您现在还可以选择 利用它的潜力. 这样就可以为任何特定任务选择最佳工具. 两个API都用于组合 上传示例。 。 。 .

注: 这一一揽子措施现在仅是无害环境管理.

资源

状态:不稳定

注: eXist-db的REST-API有其方法和现有备选方案 不同的情况可能不同。 特别是能力 下载 QQuery 文件的源代码 默认禁止( e)_source=yes 只有在启用于 descriptor.xml) (中文(简体) ). 详细情况 options 请参看 REST-API 文档

首先,我们需要一个休息的例子.

import { getRestClient } from '@existdb/node-exist'
const rc = getRestClient()

更多信息另见 连接选项。 。 。 .

返回的 HTTP 客户端有 4 个方法

  • post(query, path[, options]): 执行 query 二、在增进和保护人权方面 path。 。 。 . 这个 query 预计将是一个 QQury 主模块, 并将被包裹在存在的 XML- flagment 中.

    const { bodyText } = await rc.post('count(//p)', '/db')
    console.log(bodyText)
    
  • put(data, path): 在数据库中创建资源. 如果路径中的子集缺失,它们将被创建给你. 服务器将使用状态代码400, Bad Request, 为不.. 组成 XML 资源。 在这种情况下,尸体包含一个详细的 描述验证错误.

    await rc.put('<root />', '/db/rest-test/test.xml')
    
  • get(path [, options][, writableStream]):从数据库读取数据. 响应机构将包含资源内容或 文件列表,如果提供的路径是收藏. 如果一个可写字的Stream被传入,反应体会被流入其中.

    const { bodyText } = await rc.get('/db/rest-test/test.xml')
    console.log(bodyText)
    
  • del(path): 从已存在的db 实例中删除资源和收藏

    await rc.del('/db/rest-test/test.xml')
    

来看看 剩余客户实例。 。 。 . REST客户使用 明白了吗 图书馆 并用流水和发电机工作. 看这个 休息测试 以看到实例.

XML - RPC 相机

创建、阅读和删除收藏 :

import { getXmlRpcClient } from '@existdb/node-exist'
const db = getXmlRpcClient()

db.collections.create('/db/apps/test')
  .then(result => db.collections.describe('/db/apps/test'))
  .then(result => console.log('collection description:', result))
  .catch(e => console.error('fail', e))

将 XML 文件上传到数据库

import { getXmlRpcClient } from '@existdb/node-exist'
const db = getXmlRpcClient()

db.documents.upload(Buffer.from('<root/>'))
  .then(fileHandle => db.documents.parseLocal(fileHandle, '/db/apps/test/file.xml'))
  .then(result => db.documents.read('/db/apps/test/file.xml'))
  .then(result => console.log('test file contents', result))
  .catch(error => console.error('fail', error))

由于与数据库的所有交互都是承诺,您也可以使用同源函数

import { getXmlRpcClient } from '@existdb/node-exist'
const db = getXmlRpcClient()

async function uploadAndParse (filePath, contents) {
  const fileHandle = await db.documents.upload(contents)
  await db.documents.parseLocal(fileHandle, filePath, {})
  return filePath
}

try {
  const filePath = await uploadAndParse('/db/apps/test-file.xml', Buffer.from('<root/>'))
  console.log("uploaded", filePath)
} catch (error) {
  console.error(error)
}

你也可以看看这个 实例 更多的用例.

连接选项

在上一节中,你了解到有两个 API 您可以用来与存在db 实例交互 .

两种客户端构造函数都接受类型选项参数 NodeExistConnectionOptions。 。 。 . 毫无论据地召唤他们,如上述例子将使用 默认选项.

{
  basic_auth: {
    user: 'guest',
    pass: 'guest'
  },
  protocol: 'https:',
  host: 'localhost',
  port: '8443',
  path: '/exist/rest'|'/exist/xmlrpc'
}

注: 这个 path 属性,到达 API 的终点, 对 REST 不同('/exist/rest')和XML-RPC('/exist/xmlrpc') (中文(简体) ). 你很可能不需要改变它。 不过,如果你需要的话 让你可以控制这些.

含有默认值的 REST 客户端

import { getRestClient } from '@existdb/node-exist'
const rest = getRestClient({
  basic_auth: {
    user: 'guest',
    pass: 'guest'
  },
  protocol: 'https:',
  host: 'localhost',
  port: '8443',
  path: '/exist/rest'
})

默认的 XmlRpc 客户端

import {getXmlRpcClient} from '@existdb/node-exist'
const db = getXmlRpcClient({
  basic_auth: {
    user: 'guest',
    pass: 'guest'
  },
  protocol: 'https:',
  host: 'localhost',
  port: '8443',
  path: '/exist/xmlrpc'
})

实例

  • 联系人不是客人

    {
      basic_auth: {
        user: 'me',
        pass: '1 troubadour artisanal #compost'
      }
    }
    
  • 连接到 a 地方发展 使用 HTTP 的服务器

    {
      protocol: 'http:',
      port: 8080
    }
    
  • 连接到服务器 无效 或者说 过期 证书.

    {
      host: 'here.be.dragons',
      rejectUnauthorized: false
    }
    

    注: 对于远程主机来说,此考虑 不良做法 因为它只是 提供虚假的安全感. 对于被认为是本地的主机 - localhost, (中文(简体) ), 127.0.0.1 财务报告和审定财务报表 [::1] - 说吧 这是自动设置的, 因为不可能有信任的证书 用于本地主机.

  • 放弃需要超过十分钟的请求

    {
      timeout: 600000
    }
    

    timeout 以毫秒计,既适用于等待响应 标题和两块反应体之间的暂停. 默认, 0,无限期等待,所以运行中的查询不会被剪切 由客户关闭。 查询和REST post 接受一个 timeout 中标 选项,用于一个单调. 软件包操作db.app.*从来没有时间.

从环境读取选项

readOptionsFromEnv 提供了阅读连接选项的舒适方式 从一组环境变量中

变量名称默认说明
EXISTDB_USER无用户用于连接数据库并使用
EXISTDB_PASS无在数据库中认证用户的密码
EXISTDB_SERVERhttps://localhost:8443要连接到的数据库实例的 URL( 只允许 http 和 https 协议)
EXISTDB_TIMEOUT无 (无限期等待)毫秒前,请求时间结束, 0 无限期等待

注: 作为用户以外的一个实例连接 guest 两者 EXISTDB_USER 财务报告和审定财务报表 EXISTDB_PASS 必须准备好!

import {getXmlRpcClient, getRestClient, readOptionsFromEnv} from '@existdb/node-exist'
const db = getXmlRpcClient(readOptionsFromEnv())
const rest = getRestClient(readOptionsFromEnv())

更多细节,请查看如何使用 连接脚本 用于测试和全部测试 示例脚本。 。 。 .

构成部分

这个 XML - RPC 相机 命令按其运行对象分组为组件. 每个方法都回报一个承诺.

查询

状况:工作

execute, (中文(简体) ), read 财务报告和审定财务报表 readAll 接受一个 timeout 内 options输入 毫秒( 毫秒)0 (无限制地等待)。 它超越了连接 超时 仅用于此查询,而不发送到 数据库.

db.queries.readAll(query, { variables, timeout: 0 })

执行

db.queries.execute(query, options)

读取

db.queries.read(query, options)

全部读取

此便利函数调用查询 。 计数后检索所有结果页面,并在数组中返回.

db.queries.readAll(query, options)

示例

const query = `xquery version "3.1";
xmldb:get-child-collections($collection)
  => string-join(",\n")
`
const options = { variables: collection: "/db/apps" }

db.queries.readAll(query, options)
  .then(result => {
    const response = Buffer.concat(result.pages).toString() 
    console.log(response)
  })
  .catch(error => console.error(error))

计数

db.queries.count(resultHandle)

检索

db.queries.retrieveResult(resultHandle, page)

全部检索

db.queries.retrieveAll(resultHandle)

释放

服务器上的免费结果

db.queries.releaseResult(resultHandle)

文档

文档可以被视为文件. 如果它的类型不是二进制的话, 它可能会被索引 .

上传

解析为文件控件,然后可以被 db.documents.parseLocal。 。 。 .

db.documents.upload(Buffer.from('test'))

解析本地语言

db.documents.parseLocal(fileHandle, 'foo/test.txt')

读取

读取存储为 XML 的资源 (S)XMLResource) (中文(简体) ). 你可以控制他们 按设置序列化 序列化选项 在选项参数中.

使用默认序列化选项 .

db.documents.read('foo.xml')

强制 XML 声明要返回 .

db.documents.read('foo.xml', { "omit-xml-declaration": "no" })

强制文件以一行空行结尾( 自 eXist- db v 6. 0.

db.documents.read('foo.xml', { "insert-final-newline": "yes" })

已读

读取存储为二进制的资源( R)BinaryResource内在存在,如" ", 文本文件、PDF、CSS、图像等.

db.documents.readBinary('foo.xml')

删除

db.documents.remove('foo.xml')

资源

状况:工作

在数据库中,资源按其路径确定. 文档 财务报告和审定财务报表 收藏是资源.

说明

db.resources.describe(resourcePath)

设置

db.resources.setPermissions(resourcePath, 400)

获得许可

db.resources.getPermissions(resourcePath)

收款

状况:工作

创建

db.collections.create(collectionPath)

删除

db.collections.remove(collectionPath)

说明

db.collections.describe(collectionPath)

读取

db.collections.read(collectionPath)

已存在

此函数检查收藏是否存在 .

  • 返回时 true 如果收藏已存在且当前用户可以打开
  • 返回时 false 如果收藏不存在
  • 如果收藏已存在但当前用户无法执行,则丢弃例外 打开它
db.collections.exists(collectionPath)

已存在并可以打开

此函数检查收藏是否存在, 如果确实存在, 如果当前用户可以访问它 .

  • 返回时 true 如果收藏已存在且当前用户可以打开
  • 返回时 false 如果收藏不存在
  • 如果收藏已存在但当前用户无法执行,则丢弃例外 打开它
db.collections.existsAndCanOpen(collectionPath)

应用

状况:工作

上传

上传 XAR后可以安装

db.app.upload(xarBuffer, xarName)

示例

const xarContents = fs.readFileSync('spec/files/test-app.xar')

db.app.upload(xarContents, 'test-app.xar')
  .then(result => console.log(result))
  .catch(error => console.error(error))

安装

安装上传的 XAR( 这将调用 repo:install-and-deploy-from-db) (中文(简体) ). 为额外安全起见,先前安装的版本将在前被移除 安装新版本 .

依赖性将从 http://sexual-db.org/sexual/apps/public-repo 互联网档案馆的存檔,存档日期2013-12-22 默认. 如果您想要使用不同的寄存器, 则提供可选 customPackageRepoUrl。 。 。 .

db.app.install(xarName[, customPackageRepoUrl])

示例

db.app.install('test-app.xar')
  .then(result => console.log(result))
  .catch(error => console.error(error))

回返

{
  "success": true,
  "result": {
    "update": false, // true if a previous version was found
    "target": "/db/apps/test-app"
  }
}

错误

{
  success: false,
  error: Error
}

删除

卸载 财务报告和审定财务报表 删除其命名空间 URL 识别的应用程序. 如果没有应用 packageUri 由此可以发现,这是成功的.

db.app.remove(packageUri)

示例

db.app.remove('http://exist-db.org/apps/test-app')
  .then(result => console.log(result))
  .catch(error => console.error(error))

回返

{ success: true }

错误

{
  success: false,
  error: Object | Error
}

软件包收集

节点- 存在将上传的收藏路径 软件包改为(/db/pkgtmp) (中文(简体) ). 用于清理 相助安设.

示例

db.documents.remove(`${db.app.packageCollection}/test-app.xar`)

指数

状态: 待办

用户

状况:工作

获取用户信息

将返回给定用户的信息 .

db.users.getUserInfo(username)

示例

db.users.getUserInfo('admin')

回返情况:

{
    uid: 1048574,
    'default-group-id': 1048575,
    umask: 18,
    metadata: {
      'http://exist-db.org/security/description': 'System Administrator',
      'http://axschema.org/namePerson': 'admin'
    },
    'default-group-name': 'dba',
    'default-group-realmId': 'exist',
    name: 'admin',
    groups: [ 'dba' ],
    enabled: 'true'
}

列表

db.users.list()

返回一组用户信息对象(见 获取用户信息 ()) (中文(简体) ).

服务器

状况:工作

版本

查询运行在服务器上的 eXist-db 版本 . 返回 SemVer 版本为字符串(例如:. 5.4.1 或者说 6.1.0-SNAPSHOT) (中文(简体) ).

db.server.version()

同步到磁盘

db.server.syncToDisk()

关闭

db.server.shutdown()

注:无道再提.

命令行脚本

您可以使用此库来构建一个命令行界面,与已存在的b实例相互作用. 几个基本 实例 如何做到这一点将包含在这个寄存器中.

示例

spec/examples/exist-ls /db/apps

注: 来看看 页:1 对于一个CLI客户端 建立节点-性别.

测试

所有测试都在 光谱/测试 并写入 磁带

npm test

注: 您可以覆盖环境变量的连接设置 。 见 实例 更多信息.

要使用不同的服务器执行单个运行, 您也可以直接定义变量 :

EXISTDB_SERVER=http://localhost:8888 npm test

路线图

  • 切换到使用 eXist-db 的 REST- API( 可通过 休息客户(中文(简体) )
  • 重建ES6模块
  • 更好的类型提示

兼容性

节点性别 测试与 eXist-db、4、5和6。 。 。 . 除XAR安装外,它应该与第3版相兼容.

免责声明

自己冒险使用.

这个软件是安全的开发. 它可能被用于与生产实例合作,但在你的数据丢失前再三思考.

版本与发布记录

@existdb/node-exist 共发布 48 个版本,首次发布于 2018/07/26;过去 12 个月发布了 3 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
8.0.0latest2026/09/132 个月前
7.0.02026/01/289 个月前
6.0.02026/01/179 个月前
5.5.22025/04/011.6 年前
5.5.12023/11/152 年前
5.5.02023/10/213 年前

关于 @existdb/node-exist 的常见问题

@existdb/node-exist 是什么?

与 eXist DB 的 XML- RPC API 基于承诺的交互

如何安装 @existdb/node-exist?

在项目目录运行 npm install @existdb/node-exist,或使用 pnpm add / yarn add / bun add。

@existdb/node-exist 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/existdb__node-exist 是否存在。

@existdb/node-exist 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@existdb/node-exist 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22.19.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@existdb/node-exist 可以商用吗?

@existdb/node-exist 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@existdb/node-exist 的下载量有多少?

根据 npm 官方下载统计,@existdb/node-exist 在 2026/10/14 – 2026/11/12 这 30 天内被下载 3,000 次,日均约 100 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@existdb/node-exist 还在维护吗?

最新版本 8.0.0 发布于 2026/09/13(2 个月前);至今共发布 48 个版本,其中过去 12 个月发布了 3 个;首次发布于 2018/07/26。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。