Node.js - listener must be a function error
24,641
Solution 1
Looks like you've got the arguments to https.request
wrong (http://nodejs.org/api/https.html#https_https_request_options_callback). Should just be:
var proxy = https.request(options, function(res) {
res.pipe(client_res, {
end: true
});
});
Your certificate information should be included in the options object, from the linked page:
var options = {
hostname: 'encrypted.google.com',
port: 443,
path: '/',
method: 'GET',
key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};
options.agent = new https.Agent(options);
var req = https.request(options, function(res) {
...
}
Solution 2
I solved this error by passing the function name as the param rather than the variable that holds the function
Author by
Brian Smith
Updated on February 09, 2020Comments
-
Brian Smith over 4 years
I'm trying to convert the accepted answer on (How to create a simple http proxy in node.js?) from http to https.
When I try to access the proxy from my browser, the server quits and throws this error :
events.js:171 throw TypeError('listener must be a function'); ^ TypeError: listener must be a function
Here is my code :
var https = require('https'); var fs = require('fs'); var ssl = { ca: fs.readFileSync("cacert.pem"), key: fs.readFileSync("key.pem"), cert: fs.readFileSync("cert.pem") }; https.createServer(ssl, onRequest).listen(3000, '127.0.0.1'); function onRequest(client_req, client_res) { console.log('serve: ' + client_req.url); var options = { hostname: 'www.example.com', port: 80, path: client_req.url, method: 'GET' }; var ssl = { ca: fs.readFileSync("cacert.pem"), key: fs.readFileSync("key.pem"), cert: fs.readFileSync("cert.pem") }; var proxy = https.request(ssl, options, function(res) { res.pipe(client_res, { end: true }); }); client_req.pipe(proxy, { end: true }); }
As you can see, I made very little changes and I'm not sure how to fix this.
Any ideas?