随着技术的发展, 我们的前端页面采用https协议传输, 这是几乎是必然的.
将来的网页甚至可能强制使用https(苹果已经开始这样做了)
因此后端暴露的API接口也应该使用https. 否则有些浏览器会报出协议不一致的错误.net::ERR_SSL_PROTOCOL_ERROR错误
解决这个问题最佳的方法是: 我们的koa2后端应用程序暴露https协议API接口,前端直接发送https头的请求一. 安装https、koa-sslify、fs库
npm i -S https fs koa-sslifykoa-sslify
koa-sslify是实施HTTPS中间件, 可对任何传入请求强制实施HTTPS连接。
在未加密的HTTP请求的情况下,koa-sslify会使用301 permanent redirect (或可选地307 Temporary Redirect)自动重定向到HTTPS地址。二. 使用koa-sslify强制使用https
在app.js中引入koa-sslify并使用
const sslify = require('koa-sslify').default app.use(sslify())三. 配置SSL证书
我们下载下来的SSL证书中,存在一套通用的key/pem文件,我们使用它们就可以
const options = { key: fs.readFileSync('ssl/xxxxyun.com.key'), cert: fs.readFileSync('ssl/xxxxyun.com.pem'),创建https服务
https.createServer(options, app.callback()).listen(3001, (err) => { if (err) { console.log('server error: ', err); } else { console.log('server at' + 3001);现在, 我们再使用https获取koa2 API就已经成功了😊
此外,由于koa-sslify强制使用https访问, 之前默认的3000端口没用了, 直接吧3000端口改为https吧.
附: 最终的bin/www#!/usr/bin/env node * Module dependencies. var app = require('../app'); var debug = require('debug')('demo:server'); var http = require('http'); var fs = require('fs'); // 引入https const https = require('https') * Get port from environment and store in Express. var port = normalizePort(process.env.PORT || '3000'); // app.set('port', port); * Create HTTP server. // var server = http.createServer(app.callback()); * Listen on provided port, on all network interfaces. // server.listen(port); // server.on('error', onError); // server.on('listening', onListening); const options = { key: fs.readFileSync('ssl/xxxxyun.com.key'), cert: fs.readFileSync('ssl/xxxxyun.com.pem'), var httpsserver = https.createServer(options, app.callback()) httpsserver.listen(port, (err) => { if (err) { console.log('server init error', err); } else { console.log('server running at port :' + port); httpsserver.on('error', onError); httpsserver.on('listening', onListening); * Normalize a port into a number, string, or false. function normalizePort(val) { var port = parseInt(val, 10); if (isNaN(port)) { // named pipe return val; if (port >= 0) { // port number return port; return false; * Event listener for HTTPs server "error" event. function onError(error) { if (error.syscall !== 'listen') { throw error; var bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port; // handle specific listen errors with friendly messages switch (error.code) { case 'EACCES': console.error(bind + ' requires elevated privileges'); process.exit(1); break; case 'EADDRINUSE': console.error(bind + ' is already in use'); process.exit(1); break; default: throw error; * Event listener for HTTPs server "listening" event. function onListening() { var addr = httpsserver.address(); var bind = typeof addr === 'string'