How to create gun server on heroku - node.js

I'm reading about gun db. I want to create an electron app that will sync data between two or more clients and I'm thinking to use heroku to run a gun server. I found this example code of how to setup a gun server using node and express:
var port = process.env.OPENSHIFT_NODEJS_PORT || process.env.VCAP_APP_PORT || process.env.PORT || process.argv[2] || 8765;
var express = require('express');
var Gun = require('..');
require('../axe');
var app = express();
app.use(Gun.serve);
app.use(express.static(__dirname));
var server = app.listen(port);
var gun = Gun({ file: 'data', web: server });
global.Gun = Gun; /// make global to `node --inspect` - debug only
global.gun = gun; /// make global to `node --inspect` - debug only
console.log('Server started on port ' + port + ' with /gun');
I don't know if this will work on heroku, as I know, heroku has it's own port to listen to. Also I found an heroku button to quickly deploy a gun server on heroku. If I use it how I can modify the code pushed on heroku if needed? Anyone has experience with this decentralized database?

1. Heroku listens to its own port which you need to bind to. It is already done in the code you provided process.env.PORT.
var port = process.env.OPENSHIFT_NODEJS_PORT || process.env.VCAP_APP_PORT || process.env.PORT || process.argv[2] || 8765;
It binds to port 8765 if the environment variables OPENSHIFT_NODEJS_PORT, VCAP_APP_PORT and PORT doesn't exist and there wasn't an argument provided when executing the program.
2. Heroku's file system are ephemeral. Anything that is not versioned/committed in git is lost. So using Heroku's filesystem as a database is a bad idea.
https://help.heroku.com/K1PPS2WM/why-are-my-file-uploads-missing-deleted
You need a real database server.
3. Provide the Heroku Deploy Button link
You should be able to just fork the project on GitHub, make your changes there. Heroku Deploy Buttons are reusable.

Related

Express Generator ignores port setting

I am using the following code to set the port to 3004 in an express generator app, right above module.exports = app;
// app.js
const PORT = 3004;
app.set('port', PORT);
app.listen(PORT, () => {
console.log(`app listening on port ${PORT}`);
});
I tried using app.set based on this other topic: Node.js/Express.js App Only Works on Port 3000
And app.listen is suggested in the official docs.
They don't work together or in isolation. Running npm start reverts to port 3000, which crashes the app in my case since I'm using that port for another app (also express generator based).
I do not have this issue when starting from my own express app from scratch. Therefore I believe express generator is hiding the port configuration elsewhere and overriding my settings.
Does anyone know where to set the port or disable the overriding setting?
"express": "~4.16.0"
When you use the generator you get a bin folder In your bin folder in www is where the port is set like so:
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
This is where you can change it...

How to get express to listen to external connection?

I am trying to get this little piece of code working in Node:
#!/usr/bin/env node
var debug = require('debug')('server_auth');
var app = require('../app');
app.set('port', process.env.PORT || 3000);
var server = app.listen(app.get('port'), function() {
debug('Express server listening on port ' + server.address().port);
});
it is from the Podio API for node:
https://github.com/podio/podio-js/blob/master/examples/server_auth/bin/www
Point is, I get this going from localhost, and can pick it up, but I have no clue how to get Express respond from an external program.
If you in your firewall have that port, in your case port 3000, open you can use any other computer in your network and make the call against your IP:3000 and then the route you want to reach.

Application failed to start (port 8080) not available

I am trying to deploy my node.js application (with express and mongoose) to openshift and I am not able to do so. The application works perfectly on my local environment.
my entry point is the file /bin/www
I establish this as the entry point on openshift with this line in the package.json file (per this thread):
"main": "bin/www",
I have made sure to set my mongodb connection using environment variables according to the guide like so:
// default to a localhost configuration:
var mongoConnectionString = 'mongodb://127.0.0.1/code-blog';
// if OPENSHIFT env variables are present, use the available connection info:
if (process.env.OPENSHIFT_MONGODB_DB_PASSWORD) {
mongoConnectionString = process.env.OPENSHIFT_MONGODB_DB_USERNAME + ":" +
process.env.OPENSHIFT_MONGODB_DB_PASSWORD + "#" +
process.env.OPENSHIFT_MONGODB_DB_HOST + ':' +
process.env.OPENSHIFT_MONGODB_DB_PORT + '/' +
process.env.OPENSHIFT_APP_NAME;
}
mongoose.connect(mongoConnectionString);
The error that I get is:
remote: Waiting for application port (8080) become available ...
remote: Application 'codeblog' failed to start (port 8080 not available)
remote: -------------------------
remote: Git Post-Receive Result: failure
remote: Activation status: failure
remote: Activation failed for the following gears:
remote: 558a25bd5973ca7a74000162 (Error activating gear: CLIENT_ERROR: Failed to
execute: 'control start' for /var/lib/openshift/558a25bd5973ca7a74000162/nodejs
remote: #<IO:0x00000000b49380>
remote: #<IO:0x00000000b49308>
remote: )
remote: Deployment completed with status: failure
remote: postreceive failed
To ssh://558a25bd5973ca7a74000162#codeblog-donaldsubert.rhcloud.com/~/git/codebl
og.git/
29635a8..7a0e926 master -> master
This is peculior to me because I do not specify port 8080 anywhere. In fact, the default port is specified here:
var port = normalizePort(process.env.OPENSHIFT_NODEJS_PORT || "3000");
var server_ip_address = process.env.OPENSHIFT_NODEJS_IP || "127.0.0.1";
app.set('port', port);
var server = http.createServer(app);
I am not really sure where to go from here. I don't seem to have enough information to determine my next step.
[edit]
I added some logging to test what port this is running on, but the logging statement is never run. Here is the code
console.log("TEST TEST TEST");
var app = require('../app');
var debug = require('debug')('ProjectTemplate:server');
var http = require('http');
var port = normalizePort(process.env.OPENSHIFT_NODEJS_PORT || "3000");
var server_ip_address = process.env.OPENSHIFT_NODEJS_IP || "127.0.0.1";
console.log("PORT: ", port);
and output
TEST TEST TEST
module.js:340
throw err;
^
Error: Cannot find module './routes/logIn'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.<anonymous> (/var/lib/openshift/558a25bd5973ca7a74000162/app-root/ runtime/repo/app.js:26:13)
TEST TEST TEST is from a logging statement at the beginning of the entry point file. Something seems to fail before it hits the console.log("PORT: ", port); It is probable that this is something to do with app.js where the MongoDb connection is made.
[/edit]
Had exactly same error message: Application 'appname' failed to start (port 8080 not available) on open shift node app
After a lot of reading found out that many different users came to different solutions for the same error message, including myself. So I'd advice not to look for quick solutions for this error.
The most important step is step 1 in the below list.
My solution was to add a missing dependency in package.json, for my particular case I needed to add "bcrypt":"~0.8.5", such a stupid thing!
Now, how did I get to fix the issue only knowing the "port 8080 not available" error:
ssh'd into the app, went to the app repo dir (cd $OPENSHIFT_REPO_DIR) and run npm start
Got [...] Error: Cannot find module 'bcrypt' [...]
Logged out from ssh, run npm info bcrypt | grep "version:", it returned "0.8.5"
Added entry "bcrypt":"~0.8.5" to my package.json and commited/pushed changes.
Problem solved, app runs!
The error turned out to be a generic error that had nothing to do with the port. Apparently, if there is any fatal javascript error, it gives this message.
I have mentioned in detail here ... Application 'appname' failed to start (port 8080 not available) on open shift node app
The solution is you need to specify IP address when listening server.
This is how I have fixed it.
var express = require('express');
var app = express();
var http = require('http');
app.set('port', process.env.OPENSHIFT_NODEJS_PORT || process.env.PORT || 3002);
app.set('ip', process.env.OPENSHIFT_NODEJS_IP || "127.0.0.1");
http.createServer(app).listen(app.get('port') ,app.get('ip'), function () {
console.log("✔ Express server listening at %s:%d ", app.get('ip'),app.get('port'));
server();
});
I don't think that this line will create the server on the specified port
var server = http.createServer(app);
You will need to tell it to listen on the port like so:
server.listen(port);
While your app is listening on the correct port, the thing missing is that you don't specify the IP address to listen on. Add something like the following below app.set('port', port);
app.set('ipaddr', server_ip_address);
For me it was the connection string. The one that was suggested right after you created the mongodb cartridge is not working: Connection URL: mongodb://$OPENSHIFT_MONGODB_DB_HOST:$OPENSHIFT_MONGODB_DB_PORT/'nodejs'
But from this article, by using the OPENSHIFT_MONGODB_DB_URL variable it worked.
if(process.env.OPENSHIFT_MONGODB_DB_URL){
mongodb_connection_string = process.env.OPENSHIFT_MONGODB_DB_URL + db_name;
}

NodeJS Deployment confusion between localhost and other domain?

I have a simple program which executes fine in localhost.
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World!');
});
var port = process.env.PORT || 8080;
var host = "127.0.0.1";
var server = app.listen(port, host, function(){
console.log("Server running in : ",host ," with port no : ",port);
});
Trying to deploy the same to heroku using codeship. Everything is building perfect except the last line of deployment test command i.e node index.js which in turn is referring to 127.0.0.1 and stops deploying. May i know do i need to change something here for the host and port address
Just don't provide a host:
var server = app.listen(port, function() {
console.log('Server listening on', port);
});
(This implies, "accept connections on any host, on this port", vs what you're trying which implies, "accept connections on 127.0.0.1 on this port")
Try to run your app on localhost with the help of foreman that is a part of the Heroku Toolbelt. For instance:
foreman start web
You should see your app running on http://localhost:5000 or the port you have specified in your package.json file.
Suggest this link for further queries:
prerequisites to deploy a node app on Heroku?
I was able to host it successfully following through this steps
As suggested by #hunterloftis, i removed hostname.
More importantly, Procfile was missing,so added it and deployed successfully

How to run express.js 4.0 app in webstorm 7

As you might know that new express.js version has came out and it contains most of the changes including restful routes etc. In previous version to run an app we use to set app.js in webstorm but now in express 4.0 to run an app npm is required npm start is command.
Does any body know how to setup an express 4.0 app in webstrom to run from it?
In your Configuration, go to "JavasScript file" and change it to this value: bin\www
Click the 'Run' button (the green triangle), and in the console you should see: "Express server listening on port 3000". Then you can access your app at http://localhost:3000.
I found one hack for this. That is when you create new express.js 4.0 app you will notice that appname/bin/www.txt file get created which contains following code
var debug = require('debug')('my-application');
var app = require('../app');
app.set('port', process.env.PORT || 3000);
var server = app.listen(app.get('port'), function() {
debug('Express server listening on port ' + server.address().port);
});
just comment out this line var app = require('../app'); copy that code and paste at bottom of your app.js i.e appname/app.js
that's it now you run an app from node app.js

Resources