当尝试通过节点连接到twilio并做出反应时,出现了这个奇怪的twilsoc错误。我不知道如何解决此问题。这似乎发生在我的应用程序的服务器端。我已经根据网站上的说明生成了令牌。
index.js:1437 Error: Can't connect to twilsock
at Upstream.send (upstream.js:245)
at TwilsockClient.post (client.js:280)
at network.js:176
at Retrier.<anonymous> (network.js:114)
at Retrier.emit (events.js:136)
at Retrier.attempt (retrier.js:56)
at retrier.js:111
这是在前端
componentDidMount() {
fetch("http://localhost:3001/chat/token", {
headers: { 'Content-Type': 'application/x-www-form-urlencoded',
'Access-Control-Allow-Origin': "*",
'Access-Control-Allow-Headers': "*"
},
method: 'POST',
body: `identity=${encodeURIComponent(this.props.username)}`
})
.then(res => res.json())
.then(data => Chat.create(data.token))
.then(this.setupChatClient)
.catch(this.handleError);
}
这是服务器
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(pino);
app.use(cors());
const sendTokenResponse = (token, res) => {
res.set('Content-Type', 'application/json');
res.send(
JSON.stringify({
token: token.toJwt()
})
);
};
app.get('/api/greeting', (req, res) => {
const name = req.query.name || 'World';
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({ greeting: `Hello ${name}!` }));
});
app.get('/chat/token', (req, res) => {
const identity = req.query.identity;
const token = chatToken(identity, config);
sendTokenResponse(token, res);
});
app.post('/chat/token', (req, res) => {
console.log('this is firing on the backend')
const identity = req.query.identity;
const token = new AccessToken('AC821b3924fcf9577a0eb017c4b21b----', "SK8c95cf6ba0e4a0ec5499d12ae4d----", "o4x7JC9xTEAsZC06SVsnfb2xZU9n----");
const chatGrant = new ChatGrant({
serviceSid:"ISdd3f2b55594f45038ac88d84b78e----" ,
});
token.addGrant(chatGrant);
token.identity = identity;
sendTokenResponse(token, res);
});
app.get('/video/token', (req, res) => {
const identity = req.query.identity;
const room = req.query.room;
const token = videoToken(identity, room, config);
sendTokenResponse(token, res);
});
app.post('/video/token', (req, res) => {
const identity = req.body.identity;
const room = req.body.room;
const token = videoToken(identity, room, config);
sendTokenResponse(token, res);
});
app.listen(3001, () =>
console.log('Express server is running on localhost:3001')
);
答案 0 :(得分:1)
express的最新版本不再使用bodyparser.json,现在已成为express的一部分,请尝试使用:
express(express.json())
代替
express(bodyParser.json())
答案 1 :(得分:1)
这里是Twilio开发人员的传播者。
这实际上看起来像我的代码。这是个好消息,因为它来自我在how to proxy to an Express server with React上的帖子,因此您可以避免CORS问题。如果您使用的是my repo,则应该能够通过运行以下命令来启动服务器和前端应用程序:
npm run dev
那么您不需要从绝对URL fetch
来代替,只需使用:
fetch("/chat/token", {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
method: 'POST',
body: `identity=${encodeURIComponent(this.props.username)}`
});
然后,webpack开发服务器会将请求代理到Express应用程序。
让我知道是否有帮助。
关于CORS的快速注释
我注意到您正在尝试从您的'Access-Control-Allow-Origin': "*", 'Access-Control-Allow-Headers': "*"
请求中传递标头fetch
。但是,它们不是请求标头,而是响应标头。如果确实需要CORS标头,则需要Express服务器将其作为响应的一部分返回。
但是正如我所说,我为本文设置代码的方式应该意味着您根本不需要CORS。因此,您现在不必为此担心。
答案 2 :(得分:0)
如果您使用的是Express,最简单的方法是使用cors模块。
首先,使用下面的代码安装它:
npm install cors
接下来,将cors中间件放入快速应用中:
app.use(cors())
如果您想了解更多信息,请阅读cors模块文档https://www.npmjs.com/package/cors
答案 3 :(得分:0)
如果这些解决方案都不起作用(它们对我不起作用),那么可能有一些帮助使错误对我消失:https://stackoverflow.com/a/56671780/404541
答案 4 :(得分:0)
我遇到了这个问题,因为在通过其余API获取令牌时,我拼写了所用的SID。我确保SID正确并且错误消失了。