服务器上的节点获取请求失败:无法获取本地颁发者证书
Node Fetch Request Fails on Server: Unable to Get Local Issuer Certificate
~ 我使用的是 Node 10.9.0 和 npm 6.2.0 ~
我有以下应用程序 运行ning,它允许我在 http
和 https
期间向同一站点发出请求。
var fetch = require('node-fetch')
const express = require('express')
const app = express()
//-- HTTP --
app.get('/test-no-ssl', function(req, res){
fetch('http://jsonplaceholder.typicode.com/users')
.then(res => res.json())
.then(users => {
res.send(users)
}).catch(function(error) {
res.send(error)
})
})
//-- HTTPS --
app.get('/test-ssl', function(req, res){
fetch('https://jsonplaceholder.typicode.com/users')
.then(res => res.json())
.then(users => {
res.send(users)
}).catch(function(error) {
res.send(error)
})
})
app.listen(3003, () =>
console.log('Listening on port 3003...')
)
这两个在我的本地机器上都工作正常,return Typicode 提供的 JSON 响应。但是当我将它们作为节点应用程序部署到我的网络主机 (FastComet) 上时,我得到以下结果:
HTTP /test-no-ssl
- Returns JSON 符合预期
HTTPS /test-ssl
- Returns 出现以下错误:
{
"message" : "request to https://jsonplaceholder.typicode.com/users failed, reason: unable to get local issuer certificate",
"type" : "system",
"errno" : "UNABLE_TO_GET_ISSUER_CERT_LOCALLY",
"code" : "UNABLE_TO_GET_ISSUER_CERT_LOCALLY"
}
我搜索了这个错误并尝试了一些常用的修复方法,但没有任何帮助。
这些没有用:
npm config set registry http://registry.npmjs.org/
npm set strict-ssl=false
有没有其他人 运行 在共享托管服务提供商(支持 Node)上使用它并且能够让它工作?也许甚至是使用 FastComet 的人?楼主的后勤人员好像也不知道怎么办,我很茫然。
托管的证书颁发机构列表可能存在一些问题...作为解决方法,您可以尝试忽略证书有效性。
const fetch = require('node-fetch')
const https = require('https')
const express = require('express')
const app = express()
const agent = new https.Agent({
rejectUnauthorized: false
})
//-- HTTP --
app.get('/test-no-ssl', function(req, res){
fetch('http://jsonplaceholder.typicode.com/users')
.then(res => res.json())
.then(users => {
res.send(users)
}).catch(function(error) {
res.send(error)
})
})
//-- HTTPS --
app.get('/test-ssl', function(req, res){
fetch('https://jsonplaceholder.typicode.com/users', { agent })
.then(res => res.json())
.then(users => {
res.send(users)
}).catch(function(error) {
res.send(error)
})
})
app.listen(3003, () =>
console.log('Listening on port 3003...')
)
注意:这具有安全隐患,使 https 与 http 一样不安全。
尝试使用以下方法:
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0
~ 我使用的是 Node 10.9.0 和 npm 6.2.0 ~
我有以下应用程序 运行ning,它允许我在 http
和 https
期间向同一站点发出请求。
var fetch = require('node-fetch')
const express = require('express')
const app = express()
//-- HTTP --
app.get('/test-no-ssl', function(req, res){
fetch('http://jsonplaceholder.typicode.com/users')
.then(res => res.json())
.then(users => {
res.send(users)
}).catch(function(error) {
res.send(error)
})
})
//-- HTTPS --
app.get('/test-ssl', function(req, res){
fetch('https://jsonplaceholder.typicode.com/users')
.then(res => res.json())
.then(users => {
res.send(users)
}).catch(function(error) {
res.send(error)
})
})
app.listen(3003, () =>
console.log('Listening on port 3003...')
)
这两个在我的本地机器上都工作正常,return Typicode 提供的 JSON 响应。但是当我将它们作为节点应用程序部署到我的网络主机 (FastComet) 上时,我得到以下结果:
HTTP /test-no-ssl
- Returns JSON 符合预期
HTTPS /test-ssl
- Returns 出现以下错误:
{
"message" : "request to https://jsonplaceholder.typicode.com/users failed, reason: unable to get local issuer certificate",
"type" : "system",
"errno" : "UNABLE_TO_GET_ISSUER_CERT_LOCALLY",
"code" : "UNABLE_TO_GET_ISSUER_CERT_LOCALLY"
}
我搜索了这个错误并尝试了一些常用的修复方法,但没有任何帮助。
这些没有用:
npm config set registry http://registry.npmjs.org/
npm set strict-ssl=false
有没有其他人 运行 在共享托管服务提供商(支持 Node)上使用它并且能够让它工作?也许甚至是使用 FastComet 的人?楼主的后勤人员好像也不知道怎么办,我很茫然。
托管的证书颁发机构列表可能存在一些问题...作为解决方法,您可以尝试忽略证书有效性。
const fetch = require('node-fetch')
const https = require('https')
const express = require('express')
const app = express()
const agent = new https.Agent({
rejectUnauthorized: false
})
//-- HTTP --
app.get('/test-no-ssl', function(req, res){
fetch('http://jsonplaceholder.typicode.com/users')
.then(res => res.json())
.then(users => {
res.send(users)
}).catch(function(error) {
res.send(error)
})
})
//-- HTTPS --
app.get('/test-ssl', function(req, res){
fetch('https://jsonplaceholder.typicode.com/users', { agent })
.then(res => res.json())
.then(users => {
res.send(users)
}).catch(function(error) {
res.send(error)
})
})
app.listen(3003, () =>
console.log('Listening on port 3003...')
)
注意:这具有安全隐患,使 https 与 http 一样不安全。
尝试使用以下方法:
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0