Ninox 中未记录的函数

有些函数并未收录在 Ninox 官方文档中。它们是通过阅读代码、理解其行为而发现的。

TypeOf

typeof 函数返回指定字段的类型。

示例:

typeof(first(select Customer).'First Name');

Eval

eval 函数在指定记录的上下文中执行作为参数传入的脚本。它返回相应的值,或返回一段指出脚本错误的文本。

示例:

eval("---{this.'First Name'} {this.'Last Name'}---", first(select Customer));

输出:

Sofia Young

DebugValueInfo

debugValueInfo 函数返回一段文本,指出所传参数的类型和值。
这在 Ninox 控制台中测试代码片段时特别有用。

示例:

debugValueInfo(eval("---{this.'First Name'} {this.'Last Name'}---", first(select Customer)));

输出:
any("Sofia Young")

Debug

debug 函数相当于 JavaScript 中的 console.log
它把作为参数传入的值发送到浏览器的开发者控制台。这有助于调试公式中的代码。

示例:

(select Customer where 'First Name' like "a").(
  var 'firstName' := this.'First Name';
  var lastName := this.'Last Name';
  debug("Debug info: " + 'firstName' + " " + lastName);
)

结果会出现在浏览器的开发者控制台中(通过开发者工具打开)。

Records

records 函数根据指定的数字数组返回记录。

**注意:**该数组必须是硬编码的,不能是变量,这使得该函数不够灵活。它主要适用于需要反复取回同一批记录的场合。

示例:

records(Customer, [1, 3, 6]).'First Name';

这会取出 ID 为 136 的记录的名字。

nx-file

Ninox 中的 http() 函数可以从远程服务器获取数据。它返回一个 JSON 对象,由两个键组成:error 和/或 resultresult 键包含服务器返回的内容。

如果该内容是文本格式(例如 HTML、JavaScript、JSON 或其他文本文件),一切都没问题。但如果它是二进制文件(例如图片、PDF、Word 文档等)或部分为二进制,Ninox 会试图把这些内容存入一个文本变量。这就出现了问题,因为某些二进制值会被转义(例如值 92,十六进制为 0x5C,对应转义字符 “\”)。

原因在于 Ninox 无法直接处理字节数组。要绕开这个问题,我们可以使用 Base64,它把二进制数据转换成文本形式。关于 Base64 的更多信息见此:
https://www.freecodecamp.org/news/what-is-base64-encoding/?utm_source=chatgpt.com

Ninox 提供了一些用于处理 Base64 编码数据的函数,例如 loadFileAsBase64()loadFileAsBase64URL()。它们让您可以以 Base64 格式取回(存放在记录中的)文件。

回到我们的场景:我们需要读取一个远程二进制文件,并把它存入 Ninox 记录。在 http() 函数中,您可以定义请求头选项。通常只需用 content-type 键指明要读取的格式即可。但要处理二进制数据,我们还需要加上另一个未记录的键,名为 nx-file,并把它的值设为 "base64url"

加上 nx-file 键后,Ninox 会改变处理服务器返回内容的方式。通常情况下,Ninox 会“原样”返回内容。有了 nx-file,Ninox 会把响应转换成 Base64URL。于是,您得到的不再是这样的内容:

{"result":"�PNG\r\n\u001a\n\u0000\rIHDR\u0000\u0002�\u0000\u0002\u001f\b\u0006\u0000����\u0000\u0001DiCCPicc\u0000\u0018�c``<���[�$����WR\u0014��\u0010\u0011..."}

……而是这样:

{"result":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqoAAAIfCAYAAAC4gv6sAAABRGlDQ1BpY2MAABiVY2BgPJGTnFvMJMDAkJtXUhTk7qQQERmlwP6IgZlBhIGTgY9BNjG5uM..."}

这种新格式(Base64URL)可以直接配合 Ninox 的 importFile() 函数使用,后者会把它解释为本地 Base64 URL 并保存到指定记录中。

请记住,大多数远程服务器只接受来自其他服务器(而非客户端)的请求。因此,务必在 do as server 上下文中执行 http() 函数。

下面是一个 Ninox 全局函数示例,它让您可以把二进制数据(图片、PDF、Word 文档、Excel 文件等)读取为 Base64URL:

function loadFileOnBase64FromUrl(URL : text) do
 var fileName := extractx(URL, "\/([^\/?#]+)[^\/]*$", "$1");
 {
  fileName: fileName,
  content: do as server
    http("get", URL, {
      'content-type': "application/octet-stream",
      'nx-file': "base64url"
    }, null).result
  end
 }
end;

下面是使用该函数的示例:

var base64UrlFile := loadFileOnBase64FromUrl(url);
importFile(this, text(base64UrlFile.content), text(base64UrlFile.fileName));

这样,您就能取回一个远程二进制文件,把它转换成 Base64URL,并直接导入到 Ninox 记录中。