Fn 节点功能开发者 Kit.js
此函数开发者 Kit 使其易于向 Fn 部署节点. js 函数. 它目前支持使用JSON格式的默认(cold)和热功能.
创建节点函数
写入一个 Node.js 函数只是写一个处理器函数的问题 您通过 FDK 引用您的功能.
以创建节点函数开始 fn init 并安装 FDK :
fn init --runtime node nodefunc
cd nodefunc
这创造了一个简单的问候世界功能 func.js数字 :
const fdk=require('@fnproject/fdk');
fdk.handle(function(input){
let name = 'World';
if (input.name) {
name = input.name;
}
return {'message': 'Hello ' + name}
})
处理器函数将发送到函数的字符串输入 并返回响应字符串。 使用FDK 你不必担心阅读 输入从标准输入和写入到标准输出以返回您的响应. FDK让你专注于你的功能逻辑而不是力学.
现在运行它!
fn deploy --local --app fdkdemo
fn invoke fdkdemo nodefunc
现在您有一个基本的运行中节点函数,您可以修改并添加您想要的.
echo -n '{"name": "Tom"}' | fn invoke fdkdemo nodefunc
你应该看看结果
{"message": "Hello Tom"}
函数背景
函数引用上下文细节通过可选函数参数提供.
要接收上下文对象,只需在您的处理器函数中添加第二个参数.
在以下例子中 callID 从上下文获得并列入
响应消息 :
const fdk=require('@fnproject/fdk');
fdk.handle(function(input, ctx){
let name = 'World';
if (input) {
name = input;
}
return 'Hello ' + name + ' from Node call ' + ctx.callID + '!';
})
上下文载有关于请求的其他上下文信息,例如:
ctx.config: 包含函数配置变量(来自环境)的对象(只读)ctx.headers: 包含事件输入头作为字符串列表(只读)的对象ctx.deadline(单位:千美元)Date显示函数调用何时必须处理的对象ctx.callID: 当前呼叫的呼叫IDctx.fnID: 当前函数的函数 IDctx.memory: 分配给此函数的 MB 中 RM 数量ctx.contentType: 收到的请求内容类型( 如果设定, 否则无效)ctx.setResponseHeader(key,values...): 设置一个或多个值的响应头ctx.addResponseHeader(key,values...): 将数值添加到现有的响应头ctx.responseContentType设置/读取函数的响应内容类型(读取/写入)ctx.httpGateway此函数的 HTTP 网关上下文( 如果设置) 见HTTPGatewayContext下级
同步函数响应
通过返回 Javascript 返回函数的同步响应 Promise 从函数机构:
const fdk=require('@fnproject/fdk');
fdk.handle(function(input, ctx){
return new Promise((resolve,reject)=>{
setTimeout(()=>resolve("Hello"),1000);
});
})
您还可以使用 async编号 :await 要求公约发挥作用.
处理非 Json 输入和输出
默认情况下, FDK 会尝试将输入转换成 JSON 对象, 否则会回到它的字符串格式 .
同样,默认一个函数的输出会作为JSON对象处理并使用JSON.stringify进行转换.
要更改输入的处理, 您可以添加一个额外 options 参数改为 fdk.handle 指定输入处理策略:
function myfunction(input,ctx){}
fdk.handle(myfunction, {inputMode: 'string'})
有效的输入模式是:
json(默认)试图将输入解析为json或返回到原始(可能为二进制)字符串值string总是将输入视为字符串buffer将输入读入 aBuffer对象并传递到您的函数
要更改默认函数的输出处理, 您应该使用响应装饰符来包装结果值 :
function myfunction(input,ctx){
return fdk.rawResult("Some string")
}
fdk.handle(myfunction)
现有的装饰有:
rawResult({string|Buffer})将结果直接传递到响应 - 值可以是字符串或缓冲器 - 这将不编码字符串对象上的引用streamResult({ReadableStream})管道内装ReadableStream输入输出 - 这允许从文件或 HTTP 回复中处理数据
使用 HTTP 头并设置 HTTP 状态代码
您可以使用 ctx.protocol.header(key),此返回匹配头头的第一个头值 key (条块化后)和 ctx.protocol.headers 返回包含所有信头的对象.
const fdk=require('@fnproject/fdk');
fdk.handle(function(input, ctx){
let hctx = ctx.httpGateway
console.log("Request URL" , hctx.requestURL)
console.log("Authorization header:" , hctx.getHeader("Authorization"))
console.log( hctx.headers) // prints e.g. { "Content-Type": ["application/json"],"Accept":["application/json","text/plain"] }
})
外出信头和HTTP状态代码可以以类似方式被修改:
const fdk=require('@fnproject/fdk');
fdk.handle(function(input, ctx){
let hctx = ctx.httpGateway
hctx.setResponseHeader("Location","http://example.com")
hctx.statusCode = 302
})
这个 HTTPGatewayContext 对象的接口与 Context 但只访问函数的 HTTP 头 :
hctx.requestURL: 获取网关接收到的函数的 http 请求 URL( 否设置)hctx.method: 获取用于引用网关的 HTTP 请求方法hctx.headers: 获取收到的请求的 HTTP 头( 只读)hctx.statusCode: 设置 HTTP 的 HTTP 状态代码 打开hctx.setResponseHeader(key,values..), (中文(简体) ),hctx.addResponseHeader(key,values)设置/添加响应信头
Fn和Node.js 依赖关系
Fn 处理 Node.js 依赖性的方式如下:
- 如果有的话
package.json不存在node_modules目录, Fn 构建运行于npm install在构建过程中安装您的依赖关系. - 如果
node_modulesfn 假设您自己提供了依赖性,但没有安装.