Sails v1 新的基于机器的操作和自定义响应
Sails v1 new machine-based actions and custom responses
我正在从 Sails v0.12 -> v1 升级我们的 API,这是由于控制器操作使用了自验证机器。在终于经历了替换弃用代码的大量头痛之后,我陷入了困境...
使用 v0.12(更确切地说,使用较旧的 "req, res" 控制器样式),可以全面使用自定义响应处理程序。我已经利用了这一点,并在我们所有响应类型的末尾都有请求日志记录(加上一些额外的数据)。这样做是为了在数据库中记录所有请求,这样我们就可以深入了解我们的生产服务器正在做什么(因为它们是负载平衡的,必须有一个中心位置来查看这是必须的,这是一个简单的途径).
所以现在,我的问题是 "Actions2" 机器式操作。如何在这些事情中使用这些自定义响应类型?我们是否被迫在我们的存在中重复自己?我找不到任何好的文档来帮助指导这个过程,我也找不到一致的方法 "hook" 使用机器作为动作进入响应的结尾。我找不到任何关于机器可以为 Sails 提供何种选项的文档。
痛点本身很重要,接下来就是辅导,但我是这样给的
@Nelson 是的,我明白这一点,但在当时,这根本不是我想要的。我想要 Actions2 的所有好处。
编辑:虽然下面原来的、划掉的评论仍然有效,但使用 Actions2 和自定义 responses
文件夹范例的首选方法是在 Actions2 文件中执行类似于以下内容的操作:
module.exports = {
friendlyName: 'Human-friendly name of function',
description: 'Long description of function and what it does.',
inputs: {
userCommand: {
type: 'string',
required: true,
description: 'Long, human-readable description of the input'
}
},
exits: {
success: {
responseType: 'chatbotResponse'
}
},
fn: async function(inputs, exits){
// do some crazy stuff with the inputs, which has already been validated.
return exits.success('Woot');
}
}
这最终将通过 responses/chatbotResponse.js
路由,看起来类似于:
module.exports = async function chatbotResponse(data){
let res = this.res,
req = this.req;
if (!data) {
data = 'Something didn\'t go as planned...';
}
// how to call a Node Machine style helper with named inputs
await sails.helpers.finalizeRequestLog.with({req: req, res: res, body: {plainString: data}});
return res.json(data);
};
原创:
事实证明,在 Actions2 函数中,您只需添加 env
参数 async function(inputs, exists, env)
。 env
将使您能够访问 req
和 res
。因此,如果您有执行特殊任务(如请求记录)的自定义响应,您可以只使用 return await env.res.customResponse('Hurray, you made a successful call!');
我正在从 Sails v0.12 -> v1 升级我们的 API,这是由于控制器操作使用了自验证机器。在终于经历了替换弃用代码的大量头痛之后,我陷入了困境...
使用 v0.12(更确切地说,使用较旧的 "req, res" 控制器样式),可以全面使用自定义响应处理程序。我已经利用了这一点,并在我们所有响应类型的末尾都有请求日志记录(加上一些额外的数据)。这样做是为了在数据库中记录所有请求,这样我们就可以深入了解我们的生产服务器正在做什么(因为它们是负载平衡的,必须有一个中心位置来查看这是必须的,这是一个简单的途径).
所以现在,我的问题是 "Actions2" 机器式操作。如何在这些事情中使用这些自定义响应类型?我们是否被迫在我们的存在中重复自己?我找不到任何好的文档来帮助指导这个过程,我也找不到一致的方法 "hook" 使用机器作为动作进入响应的结尾。我找不到任何关于机器可以为 Sails 提供何种选项的文档。
痛点本身很重要,接下来就是辅导,但我是这样给的
@Nelson 是的,我明白这一点,但在当时,这根本不是我想要的。我想要 Actions2 的所有好处。
编辑:虽然下面原来的、划掉的评论仍然有效,但使用 Actions2 和自定义 responses
文件夹范例的首选方法是在 Actions2 文件中执行类似于以下内容的操作:
module.exports = {
friendlyName: 'Human-friendly name of function',
description: 'Long description of function and what it does.',
inputs: {
userCommand: {
type: 'string',
required: true,
description: 'Long, human-readable description of the input'
}
},
exits: {
success: {
responseType: 'chatbotResponse'
}
},
fn: async function(inputs, exits){
// do some crazy stuff with the inputs, which has already been validated.
return exits.success('Woot');
}
}
这最终将通过 responses/chatbotResponse.js
路由,看起来类似于:
module.exports = async function chatbotResponse(data){
let res = this.res,
req = this.req;
if (!data) {
data = 'Something didn\'t go as planned...';
}
// how to call a Node Machine style helper with named inputs
await sails.helpers.finalizeRequestLog.with({req: req, res: res, body: {plainString: data}});
return res.json(data);
};
原创:
事实证明,在 Actions2 函数中,您只需添加 env
参数 async function(inputs, exists, env)
。 env
将使您能够访问 req
和 res
。因此,如果您有执行特殊任务(如请求记录)的自定义响应,您可以只使用 return await env.res.customResponse('Hurray, you made a successful call!');