- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在过去的几天里,我一直在为此苦苦挣扎,但是......当我从 slack 应用程序使用我的命令调用 Slack Slash 命令时,slack 没有响应任何关于该命令的数据,例如 trigger_id。我想通过调用 dialog.open 来响应命令,但这需要命令中的 trigger_id。
目前,我正在记录来自服务器的响应;以下是打印出来的(我在 Heroku 中托管它,所以四位数字与我无法轻易从日志中完全删除的时间戳相关,请忽略它们。我还从开头省略了一大段响应由于 StackOverflow 的字符限制):
1699 length: 0,
1700 pipes: null,
1701 pipesCount: 0,
1703 flowing: true,
1704 ended: false,
1706 endEmitted: false,
1707 reading: true,
1709 sync: false,
1710 needReadable: true,
1711 emittedReadable: false,
1713 readableListening: false,
1714 resumeScheduled: false,
1716 paused: false,
1718 emitClose: false,
1719 destroyed: false,
1721 defaultEncoding: 'utf8',
1722 awaitDrain: 0,
1724 readingMore: false,
1725 decoder: null,
1727 encoding: null },
1728 readable: true,
1730 _events:
1731 [Object: null prototype] {
1732 end: [Array],
1734 drain: [Array],
1735 timeout: [Function: socketOnTimeout],
1737 data: [Function: bound socketOnData],
1738 error: [Function: socketOnError],
1739 close: [Array],
1741 resume: [Function: onSocketResume],
1742 pause: [Function: onSocketPause] },
1744 _eventsCount: 8,
1745 _maxListeners: undefined,
1747 _writableState:
1748 WritableState {
1750 objectMode: false,
1751 highWaterMark: 16384,
1753 finalCalled: false,
1754 needDrain: false,
1755 ending: false,
1757 ended: false,
1758 finished: false,
1760 destroyed: false,
1761 decodeStrings: false,
1762 defaultEncoding: 'utf8',
1764 length: 0,
1765 writing: false,
1767 corked: 0,
1768 sync: true,
1769 bufferProcessing: false,
1771 onwrite: [Function: bound onwrite],
1772 writecb: null,
1774 writelen: 0,
1775 bufferedRequest: null,
1777 lastBufferedRequest: null,
1778 pendingcb: 0,
1779 prefinished: false,
1781 errorEmitted: false,
1782 emitClose: false,
1783 bufferedRequestCount: 0,
1785 corkedRequestsFree: [Object] },
1786 writable: true,
1788 allowHalfOpen: true,
1789 _sockname: null,
1790 _pendingData: null,
1792 _pendingEncoding: '',
1793 server:
1800 Server {
1802 _events: [Object],
1803 _eventsCount: 2,
1804 _maxListeners: undefined,
1806 _connections: 1,
1807 _handle: [TCP],
1809 _usingWorkers: false,
1810 _workers: [],
1812 _unref: false,
1813 allowHalfOpen: true,
1814 pauseOnConnect: false,
1816 httpAllowHalfOpen: false,
1817 timeout: 120000,
1818 keepAliveTimeout: 5000,
1820 _pendingResponseData: 0,
1821 maxHeadersCount: null,
1822 headersTimeout: 40000,
1824 _connectionKey: '6::::33915',
1825 [Symbol(IncomingMessage)]: [Function],
1826 [Symbol(ServerResponse)]: [Function],
1828 [Symbol(asyncId)]: 4 },
1829 _server:
1831 Server {
1832 _events: [Object],
1833 _eventsCount: 2,
1835 _maxListeners: undefined,
1836 _connections: 1,
1838 _handle: [TCP],
1839 _usingWorkers: false,
1840 _workers: [],
1842 _unref: false,
1844 allowHalfOpen: true,
1845 pauseOnConnect: false,
1847 httpAllowHalfOpen: false,
1848 timeout: 120000,
1850 keepAliveTimeout: 5000,
1851 _pendingResponseData: 0,
1852 maxHeadersCount: null,
1854 headersTimeout: 40000,
1855 _connectionKey: '6::::33915',
1856 [Symbol(IncomingMessage)]: [Function],
1858 [Symbol(ServerResponse)]: [Function],
1859 [Symbol(asyncId)]: 4 },
1861 timeout: 120000,
1862 parser:
1864 HTTPParser {
1865 '0': [Function: parserOnHeaders],
1867 '1': [Function: parserOnHeadersComplete],
1868 '2': [Function: parserOnBody],
1870 '3': [Function: parserOnMessageComplete],
1871 '4': [Function: bound onParserExecute],
1873 _headers: [],
1874 _url: '',
1875 socket: [Circular],
1877 incoming: [Circular],
1878 outgoing: null,
1880 maxHeaderPairs: 2000,
1881 _consumed: true,
1883 onIncoming: [Function: bound parserOnIncoming],
1884 parsingHeadersStart: 0,
1886 [Symbol(isReused)]: true },
1887 on: [Function: socketOnWrap],
1888 _paused: false,
1890 _httpMessage:
1891 ServerResponse {
1893 _events: [Object],
1894 _eventsCount: 1,
1896 _maxListeners: undefined,
1897 output: [],
1898 outputEncodings: [],
1900 outputCallbacks: [],
1901 outputSize: 0,
1903 writable: true,
1904 _last: false,
1905 chunkedEncoding: false,
1907 shouldKeepAlive: false,
1908 useChunkedEncodingByDefault: true,
1910 sendDate: true,
1911 _removedConnection: false,
1912 _removedContLen: false,
1914 _removedTE: false,
1915 _contentLength: null,
1916 _hasBody: true,
1918 _trailer: '',
1919 finished: false,
1921 _headerSent: false,
1922 socket: [Circular],
1924 connection: [Circular],
1925 _header: null,
1926 _onPendingData: [Function: bound updateOutgoingData],
1928 _sent100: false,
1933 _expect_continue: false,
1934 req: [Circular],
1936 locals: [Object: null prototype] {},
1937 [Symbol(isCorked)]: false,
1938 [Symbol(outHeadersKey)]: [Object] },
1940 [Symbol(asyncId)]: 178,
1941 [Symbol(lastWriteQueueSize)]: 0,
1943 [Symbol(timeout)]:
1944 Timeout {
1945 _called: false,
1947 _idleTimeout: 120000,
1948 _idlePrev: [TimersList],
1950 _idleNext: [TimersList],
1951 _idleStart: 1148319,
1952 _onTimeout: [Function: bound ],
1954 _timerArgs: undefined,
1955 _repeat: null,
1957 _destroyed: false,
1958 [Symbol(unrefed)]: true,
1960 [Symbol(asyncId)]: 179,
1961 [Symbol(triggerId)]: 178 },
1962 [Symbol(kBytesRead)]: 0,
1964 [Symbol(kBytesWritten)]: 0 },
1965 _consuming: false,
1967 _dumped: false,
1968 next: [Function: next],
1970 baseUrl: '',
1971 originalUrl: '/create',
1973 _parsedUrl:
1974 Url {
1975 protocol: null,
1977 slashes: null,
1978 auth: null,
1979 host: null,
1981 port: null,
1982 hostname: null,
1984 hash: null,
1985 search: null,
1988 query: null,
1989 pathname: '/create',
1991 path: '/create',
1992 href: '/create',
1994 _raw: '/create' },
1995 params: {},
1996 query: {},
1998 res:
1999 ServerResponse {
2001 _events:
2002 [Object: null prototype] { finish: [Function: bound resOnFinish] },
2003 _eventsCount: 1,
2005 _maxListeners: undefined,
2011 output: [],
2012 outputEncodings: [],
2014 outputCallbacks: [],
2015 outputSize: 0,
2017 writable: true,
2018 _last: false,
2019 chunkedEncoding: false,
2021 shouldKeepAlive: false,
2022 useChunkedEncodingByDefault: true,
2024 sendDate: true,
2025 _removedConnection: false,
2027 _removedContLen: false,
2028 _removedTE: false,
2029 _contentLength: null,
2031 _hasBody: true,
2032 _trailer: '',
2034 finished: false,
2035 _headerSent: false,
2036 socket:
2038 Socket {
2039 connecting: false,
2041 _hadError: false,
2042 _handle: [TCP],
2044 _parent: null,
2045 _host: null,
2046 _readableState: [ReadableState],
2048 readable: true,
2049 _events: [Object],
2051 _eventsCount: 8,
2052 _maxListeners: undefined,
2053 _writableState: [WritableState],
2055 writable: true,
2056 allowHalfOpen: true,
2058 _sockname: null,
2059 _pendingData: null,
2061 _pendingEncoding: '',
2062 server: [Server],
2064 _server: [Server],
2065 timeout: 120000,
2066 parser: [HTTPParser],
2068 on: [Function: socketOnWrap],
2069 _paused: false,
2071 _httpMessage: [Circular],
2072 [Symbol(asyncId)]: 178,
2074 [Symbol(lastWriteQueueSize)]: 0,
2075 [Symbol(timeout)]:
2076 Timeout {
2078 _called: false,
2079 _idleTimeout: 120000,
2080 _idlePrev: [TimersList],
2083 _idleNext: [TimersList],
2084 _idleStart: 1148319,
2086 _onTimeout: [Function: bound ],
2087 _timerArgs: undefined,
2089 _repeat: null,
2090 _destroyed: false,
2091 [Symbol(unrefed)]: true,
2093 [Symbol(asyncId)]: 179,
2094 [Symbol(triggerId)]: 178 },
2095 [Symbol(kBytesRead)]: 0,
2097 [Symbol(kBytesWritten)]: 0 },
2098 connection:
2100 Socket {
2101 connecting: false,
2103 _hadError: false,
2104 _handle: [TCP],
2105 _parent: null,
2107 _host: null,
2108 _readableState: [ReadableState],
2109 readable: true,
2111 _events: [Object],
2112 _eventsCount: 8,
2114 _maxListeners: undefined,
2115 _writableState: [WritableState],
2116 writable: true,
2118 allowHalfOpen: true,
2119 _sockname: null,
2121 _pendingData: null,
2122 _pendingEncoding: '',
2123 server: [Server],
2125 _server: [Server],
2126 timeout: 120000,
2128 parser: [HTTPParser],
2129 on: [Function: socketOnWrap],
2131 _paused: false,
2132 _httpMessage: [Circular],
2133 [Symbol(asyncId)]: 178,
2135 [Symbol(lastWriteQueueSize)]: 0,
2136 [Symbol(timeout)]:
2138 Timeout {
2139 _called: false,
2140 _idleTimeout: 120000,
2142 _idlePrev: [TimersList],
2143 _idleNext: [TimersList],
2145 _idleStart: 1148319,
2146 _onTimeout: [Function: bound ],
2148 _timerArgs: undefined,
2149 _repeat: null,
2151 _destroyed: false,
2152 [Symbol(unrefed)]: true,
2153 [Symbol(asyncId)]: 179,
2155 [Symbol(triggerId)]: 178 },
2156 [Symbol(kBytesRead)]: 0,
2158 [Symbol(kBytesWritten)]: 0 },
2160 _header: null,
2161 _onPendingData: [Function: bound updateOutgoingData],
2163 _sent100: false,
2164 _expect_continue: false,
2166 req: [Circular],
2167 locals: [Object: null prototype] {},
2169 [Symbol(isCorked)]: false,
2171 [Symbol(outHeadersKey)]: [Object: null prototype] { 'x-powered-by': [Array] } },
2172 route:
2174 Route {
2175 path: '/create',
2176 stack: [ [Layer], [Layer] ],
2178 methods: { post: true } },
2179 body: {} }
根据我查看的所有文档、示例和教程,我应该从请求正文中获取 trigger_id,并且我认为我应该能够从响应参数中获取数据。但是,请求中的参数、查询和正文都是空的。
示例:https://github.com/slackapi/template-slash-command-and-dialogs
附带说明:我没有明确遵循教程或使用示例;我引用了他们所做的,试图找出我做错了什么。
1995 params: {},
1996 query: {}
和
2179 body: {}
那么 body、query 或 params 中应该有数据吗?从我在网上看到的情况来看,我相信是这样,但这是我第一次尝试使用 slack 机器人,至少从我所看到的情况来看,Slack 没有最好的文档,所以我很可能以某种方式称它为错误? ?
更新,这是我在我的服务器上调用的路由:
app.post('/create', jsonParser, function(req, res) {
console.log(req);
var {
text, trigger_id
} = req.body;
// if (reqBody.token != botToken) {
// res.status(403).end("Access forbidden")
// } else {
res.status(200).end() // best practice to respond with empty 200 status code
//Sample Dialog response from the GitHub example, to test if route is working
const dialog = {
token: botToken,
trigger_id: trigger_id,
dialog: JSON.stringify({
title: 'Submit a helpdesk ticket',
callback_id: 'submit-ticket',
submit_label: 'Submit',
elements: [{
label: 'Title',
type: 'text',
name: 'title',
value: text,
hint: '30 second summary of the problem',
}, {
label: 'Description',
type: 'textarea',
name: 'description',
optional: true,
}, {
label: 'Urgency',
type: 'select',
name: 'urgency',
options: [{
label: 'Low',
value: 'Low'
}, {
label: 'Medium',
value: 'Medium'
}, {
label: 'High',
value: 'High'
}, ],
}, ],
}),
};
// open the dialog by calling dialogs.open method and sending the payload
bot.dialog.open({
dialog
}).then(console.log)
});
最佳答案
您的正文为空的原因是您当前的代码假设来自 Slack 的请求是以 JSON 编码发送的。相反,它被编码为标准 POST 请求 (application/x-www-form-urlencoded
)。
替换
app.post('/create', jsonParser, function(req, res) {
与
app.use(bodyParser.urlencoded({ extended: true }))
会成功的。
关于node.js - 未从 Slack Slash Commands API 接收任何数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56144111/
初学者 android 问题。好的,我已经成功写入文件。例如。 //获取文件名 String filename = getResources().getString(R.string.filename
我已经将相同的图像保存到/data/data/mypackage/img/中,现在我想显示这个全屏,我曾尝试使用 ACTION_VIEW 来显示 android 标准程序,但它不是从/data/dat
我正在使用Xcode 9,Swift 4。 我正在尝试使用以下代码从URL在ImageView中显示图像: func getImageFromUrl(sourceUrl: String) -> UII
我的 Ubuntu 安装 genymotion 有问题。主要是我无法调试我的数据库,因为通过 eclipse 中的 DBMS 和 shell 中的 adb 我无法查看/data/文件夹的内容。没有显示
我正在尝试用 PHP 发布一些 JSON 数据。但是出了点问题。 这是我的 html -- {% for x in sets %}
我观察到两种方法的结果不同。为什么是这样?我知道 lm 上发生了什么,但无法弄清楚 tslm 上发生了什么。 > library(forecast) > set.seed(2) > tts lm(t
我不确定为什么会这样!我有一个由 spring data elasticsearch 和 spring data jpa 使用的类,但是当我尝试运行我的应用程序时出现错误。 Error creatin
在 this vega 图表,如果我下载并转换 flare-dependencies.json使用以下 jq 到 csv命令, jq -r '(map(keys) | add | unique) as
我正在提交一个项目,我必须在其中创建一个带有表的 mysql 数据库。一切都在我这边进行,所以我只想检查如何将我所有的压缩文件发送给使用不同计算机的人。基本上,我如何为另一台计算机创建我的数据库文件,
我有一个应用程序可以将文本文件写入内部存储。我想仔细看看我的电脑。 我运行了 Toast.makeText 来显示路径,它说:/数据/数据/我的包 但是当我转到 Android Studio 的 An
我喜欢使用 Genymotion 模拟器以如此出色的速度加载 Android。它有非常好的速度,但仍然有一些不稳定的性能。 如何从 Eclipse 中的文件资源管理器访问 Genymotion 模拟器
我需要更改 Silverlight 中文本框的格式。数据通过 MVVM 绑定(bind)。 例如,有一个 int 属性,我将 1 添加到 setter 中的值并调用 OnPropertyChanged
我想向 Youtube Data API 提出请求,但我不需要访问任何用户信息。我只想浏览公共(public)视频并根据搜索词显示视频。 我可以在未经授权的情况下这样做吗? 最佳答案 YouTube
我已经设置了一个 Twilio 应用程序,我想向人们发送更新,但我不想回复单个文本。我只是想让他们在有问题时打电话。我一切正常,但我想在发送文本时显示传入文本,以确保我不会错过任何问题。我正在使用 p
我有一个带有表单的网站(目前它是纯 HTML,但我们正在切换到 JQuery)。流程是这样的: 接受用户的输入 --- 5 个整数 通过 REST 调用网络服务 在服务器端运行一些计算...并生成一个
假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到: 'use strict'; var profile = { "project": "%Projec
这部分是对 Previous Question 的扩展我的: 我现在可以从我的 CI Controller 成功返回 JSON 数据,它返回: {"results":[{"id":"1","Sourc
有什么有效的方法可以删除 ios 中 CBL 的所有文档存储?我对此有疑问,或者,如果有人知道如何从本质上使该应用程序像刚刚安装一样,那也会非常有帮助。我们正在努力确保我们的注销实际上将应用程序设置为
我有一个 Rails 应用程序,它与其他 Rails 应用程序通信以进行数据插入。我使用 jQuery $.post 方法进行数据插入。对于插入,我的其他 Rails 应用程序显示 200 OK。但在
我正在为服务于发布请求的 API 调用运行单元测试。我正在传递请求正文,并且必须将响应作为帐户数据返回。但我只收到断言错误 注意:数据是从 Azure 中获取的 spec.js const accou
我是一名优秀的程序员,十分优秀!