Trilium为脚本提供了一种打开公共REST端点的机制。这为与其他服务的各种集成开辟了一条途径-一个简单的示例是通过发出slash命令从Slack创建新笔记(例如/trilium buy milk)。

从Trilium外部创建笔记

让我们看一个例子。目标是提供一个REST端点,我们可以向其发送标题和内容,Trilium将创建一个笔记。

我们将首先创建一个JavaScript后端代码笔记,其中包含:

const {req, res} = api;
const {secret, title, content} = req.body;

if (req.method == 'POST' && secret === 'secret-password') {
    // notes must be saved somewhere in the tree hierarchy specified by a parent note. 
    // This is defined by a relation from this code note to the "target" parent note
    // alternetively you can just use constant noteId for simplicity (get that from "Note Info" dialog of the desired parent note)
    const targetParentNoteId = await api.currentNote.getRelationValue('targetNote');
    
    const {note} = await api.createTextNote(targetParentNoteId, title, content);

    res.status(201).json(note);
}
else {
    res.send(400);
}

该脚本笔记还具有以下两个属性:

  • 标签customRequestHandler带有值create-note
  • 关系targetNote指向应保存新笔记的笔记

说明

让我们通过使用HTTP客户端发送请求进行测试:

POST http://my.trilium.org/custom/create-note
Content-Type: application/json

{
  "secret": "secret-password",
  "title": "hello",
  "content": "world"
}

注意请求路径中的/custom部分-Trilium将带有此前缀的任何请求视为"custom",并尝试通过查看所有具有customRequestHandler [标签)(./属性.md)的笔记来查找匹配的处理程序。然后,此标签的值包含一个正则表达式,该正则表达式将与请求路径匹配(在本例中为平凡的正则表达式"create-note")。

然后Trilium将找到上面创建的代码笔记并执行它。api.reqapi.res被设置为请求响应的对象,从中我们可以得到请求和响应的细节。

在代码笔记中,我们检查了请求方法,然后使用普通身份验证-请记住,默认情况下,这些端点完全未经身份验证,因此您需要自己进行维护。

通过这些检查后,我们将使用脚本API创建所需的笔记。

自定义资源提供者

另一个常见的用例是,你只想公开一个文件笔记-在这种情况下,你可以创建标签customResourceProvider(值还是路径正则表达式)。

注意:公开的文件需要带有#customResourceProvider =" fonts/myFont.woff"

例如,您的文件位于custom/fonts中,你可以通过custom/fonts/myFont.woff进行调用。

进阶概念

api.reqapi.res是Express.js对象-你随时可以查看其文档以了解详细信息。

参数

REST请求路径通常在URL中包含参数,例如:

http://my.trilium.org/custom/notes/123

最后一部分是动态的,因此URL的匹配也必须是动态的-因此,匹配是使用正则表达式完成的。customRequestHandler将与以下值匹配:

notes/([0-9]+)

另外,这还使用括号定义了一个匹配组,从而使提取值变得更加容易。匹配的组位于api.pathParams

const noteId = api.pathParams[0];

通常,您还需要查询参数(例如http://my.trilium.org/custom/notes?noteId=123),您可以使用标准expressreq.query.noteId获得这些参数。