~ J'utilise Node 10.9.0 et npm 6.2.0 ~
J'ai l'application suivante en cours d'exécution qui me permet de faire une demande au même site sur http
et sur 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...')
)
Ces deux éléments fonctionnent correctement sur ma machine locale et renvoient la réponse JSON fournie par Typicode. Mais lorsque je les déploie en tant qu'application Node sur mon hôte Web ( FastComet ), j'obtiens les résultats suivants:
[~ # ~] http [~ # ~] /test-no-ssl
- Renvoie le JSON comme prévu
[~ # ~] https [~ # ~] /test-ssl
- Renvoie l'erreur suivante:
{
"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"
}
J'ai recherché cette erreur et essayé quelques-unes des corrections habituelles, mais rien n'a aidé.
Ceux-ci n'ont pas fonctionné:
npm config set registry http://registry.npmjs.org/
npm set strict-ssl=false
Quelqu'un d'autre a-t-il rencontré cela sur un fournisseur d'hébergement partagé (qui prend en charge Node) et a-t-il pu faire fonctionner cela? Peut-être même quelqu'un qui utilise FastComet? Le personnel de soutien de l'hôte ne semble pas non plus savoir quoi faire, donc je suis perdu.
Essayez d'utiliser les éléments suivants:
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0
L'hébergement a probablement un problème avec la liste des autorités de certification ... comme solution de contournement, vous pouvez essayer d'ignorer la validité du certificat.
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...')
)
Remarque: cela a des implications sur la sécurité, rendant https non sécurisé de la même manière que http.