SSL_PROTOCOL_ERROR、Post 请求、客户端、api、ssl
SSL_PROTOCOL_ERROR, Post request, client, api, ssl
我收到以下错误:(index):24 POST https://goldengates.club:3000/api/transact net::ERR_SSL_PROTOCOL_ERROR
(anonymous) @ (index):24
goldengates.club/:1 Uncaught (in promise) TypeError: Failed to fetch
Promise.then (async)
(anonymous) @ (index):26
尝试从客户端向我的 api 后端发出 post 请求时。我已经用 express 打开了端口 3000,以在名为 api/transact 的端点上接收请求,客户端 post 的数据将发送到该端点。问题似乎出在我当前的 ssl 上,但我不知道具体是什么问题。
我与服务器提供商联系,他们告诉我引用 "You may need to reconfigure your application running on port 3000 to use SSL to encrypt data. If you require certificate files, they should be available in ssl directory in the user's account." Incase 这给出了提示。
相关服务器API代码:
const Blockchain = require('./blockchain');
const PubSub = require('./app/pubsub');
const TransactionPool = require('./wallet/transaction-pool');
const Wallet = require('./wallet');
const TransactionMiner = require('./app/transaction-miner');
const PubSubNub = require('./app/pubsub.pubnub');
//127.0.0.1:6379
const isDevelopment = process.env.ENV === 'development';
//TRY PUBNUB (comment out)
/*const REDIS_URL = isDevelopment ?
'redis://127.0.0.1:6379' : //try 6379 19289
'redis://h:p602b6838e89da65c8c4d29a6a4f954452d1ece59c10b27a29ebf9808721cb8e2@ec2-35-153-115-238.compute-1.amazonaws.com:9819'//19289
*/
const DEFAULT_PORT = 3000;
const ROOT_NODE_ADDRESS =
`http://localhost:${DEFAULT_PORT}`;
const app = express();
const blockchain = new Blockchain();
const transactionPool = new TransactionPool();
const wallet = new Wallet();
//const pubsub = new PubSub({ blockchain, transactionPool, redisUrl: REDIS_URL });//redis
const pubsub = new PubSubNub({ blockchain, transactionPool, wallet }); // for PubNub //change back to PubSub if issues arise
const transactionMiner = new TransactionMiner({ blockchain, transactionPool, wallet, pubsub });
//DELETE THIS
/*const config =
{
headers: {'Access-Control-Allow-Origin':'*'}
};*/
//TEST DELETE
app.use(bodyParser.json());
app.use(express.static(path.join(__dirname, 'client/dist')));
//delete below
//app.options('*', cors());
app.use(cors({
origin: 'https://goldengates.club',
allowedHeaders: ["Content-Type"],
methods: 'POST'
}));
SKIPPING TO FoCUSED ENDPOINT...
app.post('/api/transact',(req, res) => {
const { amount, recipient } = req.body;
//REMOVE
console.log(amount);
//REMOVE
let transaction = transactionPool
.existingTransaction({ inputAddress: wallet.publicKey });
try {
if (transaction) {
transaction.update({ senderWallet: wallet, recipient, amount });
} else {
transaction = wallet.createTransaction({
recipient,
amount,
chain: blockchain.chain
});
}
} catch(error) {
return res.status(400).json({ type: 'error', message: error.message });
}
transactionPool.setTransaction(transaction);
pubsub.broadcastTransaction(transaction);
res.json({ type: 'success', transaction });
});
客户端代码:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script>
const amount=10;
const recipient=1221232;
const data={amount,recipient};
const options=
{
method: 'POST',
headers:
{
'Content-Type': 'application/json',
},
body: JSON.stringify(data)
};
fetch('https://www.goldengates.club:3000/api/transact',options)
.then(response => response.json())
.then(data => console.log(data));
</script>
</body>
</html>
https://goldengates.club:3000/api/transact net::ERR_SSL_PROTOCOL_ERROR
您在端口 3000 上的应用程序未针对 HTTPS 进行设置,而仅针对 HTTP。尝试使用 HTTPS 访问普通 HTTP 服务器会导致您看到错误。请注意,您不能简单地在客户端中将 http://host:port
切换为 https://host:port
并期望服务器可以神奇地使用 HTTPS。
... they told me quote "You may need to reconfigure your application running on port 3000 to use SSL to encrypt data. If you require certificate files, they should be available in ssl directory in the user's account."
他们指出的完全一样。
除此之外,使用 HTTPS 公开 nodejs API 的一种常见方法不是让 nodejs 服务器本身能够使用 HTTPS,而是将其隐藏到某些反向代理(如 nginx)中 - 例如参见 [= 15=].
我收到以下错误:(index):24 POST https://goldengates.club:3000/api/transact net::ERR_SSL_PROTOCOL_ERROR
(anonymous) @ (index):24
goldengates.club/:1 Uncaught (in promise) TypeError: Failed to fetch
Promise.then (async)
(anonymous) @ (index):26
尝试从客户端向我的 api 后端发出 post 请求时。我已经用 express 打开了端口 3000,以在名为 api/transact 的端点上接收请求,客户端 post 的数据将发送到该端点。问题似乎出在我当前的 ssl 上,但我不知道具体是什么问题。
我与服务器提供商联系,他们告诉我引用 "You may need to reconfigure your application running on port 3000 to use SSL to encrypt data. If you require certificate files, they should be available in ssl directory in the user's account." Incase 这给出了提示。
相关服务器API代码:
const Blockchain = require('./blockchain');
const PubSub = require('./app/pubsub');
const TransactionPool = require('./wallet/transaction-pool');
const Wallet = require('./wallet');
const TransactionMiner = require('./app/transaction-miner');
const PubSubNub = require('./app/pubsub.pubnub');
//127.0.0.1:6379
const isDevelopment = process.env.ENV === 'development';
//TRY PUBNUB (comment out)
/*const REDIS_URL = isDevelopment ?
'redis://127.0.0.1:6379' : //try 6379 19289
'redis://h:p602b6838e89da65c8c4d29a6a4f954452d1ece59c10b27a29ebf9808721cb8e2@ec2-35-153-115-238.compute-1.amazonaws.com:9819'//19289
*/
const DEFAULT_PORT = 3000;
const ROOT_NODE_ADDRESS =
`http://localhost:${DEFAULT_PORT}`;
const app = express();
const blockchain = new Blockchain();
const transactionPool = new TransactionPool();
const wallet = new Wallet();
//const pubsub = new PubSub({ blockchain, transactionPool, redisUrl: REDIS_URL });//redis
const pubsub = new PubSubNub({ blockchain, transactionPool, wallet }); // for PubNub //change back to PubSub if issues arise
const transactionMiner = new TransactionMiner({ blockchain, transactionPool, wallet, pubsub });
//DELETE THIS
/*const config =
{
headers: {'Access-Control-Allow-Origin':'*'}
};*/
//TEST DELETE
app.use(bodyParser.json());
app.use(express.static(path.join(__dirname, 'client/dist')));
//delete below
//app.options('*', cors());
app.use(cors({
origin: 'https://goldengates.club',
allowedHeaders: ["Content-Type"],
methods: 'POST'
}));
SKIPPING TO FoCUSED ENDPOINT...
app.post('/api/transact',(req, res) => {
const { amount, recipient } = req.body;
//REMOVE
console.log(amount);
//REMOVE
let transaction = transactionPool
.existingTransaction({ inputAddress: wallet.publicKey });
try {
if (transaction) {
transaction.update({ senderWallet: wallet, recipient, amount });
} else {
transaction = wallet.createTransaction({
recipient,
amount,
chain: blockchain.chain
});
}
} catch(error) {
return res.status(400).json({ type: 'error', message: error.message });
}
transactionPool.setTransaction(transaction);
pubsub.broadcastTransaction(transaction);
res.json({ type: 'success', transaction });
});
客户端代码:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script>
const amount=10;
const recipient=1221232;
const data={amount,recipient};
const options=
{
method: 'POST',
headers:
{
'Content-Type': 'application/json',
},
body: JSON.stringify(data)
};
fetch('https://www.goldengates.club:3000/api/transact',options)
.then(response => response.json())
.then(data => console.log(data));
</script>
</body>
</html>
https://goldengates.club:3000/api/transact net::ERR_SSL_PROTOCOL_ERROR
您在端口 3000 上的应用程序未针对 HTTPS 进行设置,而仅针对 HTTP。尝试使用 HTTPS 访问普通 HTTP 服务器会导致您看到错误。请注意,您不能简单地在客户端中将 http://host:port
切换为 https://host:port
并期望服务器可以神奇地使用 HTTPS。
... they told me quote "You may need to reconfigure your application running on port 3000 to use SSL to encrypt data. If you require certificate files, they should be available in ssl directory in the user's account."
他们指出的完全一样。
除此之外,使用 HTTPS 公开 nodejs API 的一种常见方法不是让 nodejs 服务器本身能够使用 HTTPS,而是将其隐藏到某些反向代理(如 nginx)中 - 例如参见 [= 15=].