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 为 1、3 和 6 的记录的名字。
nx-file
Ninox 中的 http() 函数可以从远程服务器获取数据。它返回一个 JSON 对象,由两个键组成:error 和/或 result。result 键包含服务器返回的内容。
如果该内容是文本格式(例如 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 记录中。
