Yeoman inside ExpressJS - node.js

I'd still like to try to get an example running w/ Yeoman and Express.
I tried the following and it worked "okay", but I'm stuck merging the routes. (over simplified for readability)
mkdir test
cd test
express
mkdir app
cd app
mkdir js
cd js
yeoman angular
Then I changed "output:dist" to "output:../../public" in the Gruntfile.js
Now, both servers run okay on their own (e.g. yeoman server and node app.js). I can also run 'yeoman build' now to output the minified JS to /public in the express app.
I'm a bit fuzzy on how the routes might merge? I would like / to pull up the Angular route and not the express route, etc. The angular-express-seed examples on github look okay, but I would still like Yeoman integrated into the project.
Any suggestions would be appreciated.

I would recommend this structure for yeoman + expressjs:
mkdir app
cd app
yeoman angular
express .
So your dir tree should look like this:
.
├── app
│   ├── 404.html
│   ├── favicon.ico
│   ├── index.html
│   ├── robots.txt
│   ├── scripts
│   │   ├── controllers
│   │   │   └── main.js
│   │   ├── vendor
│   │   │   ├── angular.js
│   │   │   ├── angular.min.js
│   │   │   ├── es5-shim.min.js
│   │   │   └── json3.min.js
│   │   └── yeoman-test.js
│   ├── styles
│   │   └── main.css
│   └── views
│   └── main.html
├── app.js
├── Gruntfile.js
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
│   └── style.css
├── routes
│   ├── index.js
│   └── user.js
├── test
│   ├── lib
│   │   └── angular-mocks.js
│   └── spec
│   └── controllers
│   └── main.js
├── testacular.conf.js
└── views
├── index.jade
└── layout.jade
You can remove the now redundant public directory (we're going to serve from app instead):
rm -rf public
And now in app.js, you need to change which dir to serve static files from. Change this line:
app.use(express.static(path.join(__dirname, 'public')));
to this:
app.use(express.static(path.join(__dirname, 'app')));
And that should be about it. There's one careat in that you now have two "index" files -- one in views/index.jade, and the other in app/index.html. Removing the app/index.html currently breaks yeoman, so my advice is to get rid of the route for app/index.jade and just make edits to index.html.
Hope this helps!

Here is another slightly different setup
yo angular
update Gruntfile.js to change config from 'app' to 'public'.
then do
express .
open app.js and ensure there is no route mapping like this app.get('/', routes.index);
This is so node server would actually serve up index.html, the same file that loads up when running "grunt server".
Now go ahead and delete public directory and then move app directory to public
rm -rf public
mv app public

This project seems to cover all of the requirements (and even has optional support for MongoDB): https://github.com/DaftMonk/generator-angular-fullstack
I've just tried it locally and it works:
npm install -g generator-angular-fullstack
yo angular-fullstack [appname]
See the GitHub page for more info.

I would comment on #btford 's answer if I had the reputation -
Just wanted to add that installing express . after yo angular will overwrite the grunt-created package.json file which will break grunt as #jjperezaguinaga reported.
Make sure to save a copy of package.json before installing express .. Then add the following dependencies to the original package.json:
"dependencies" : {
"express": "3.3.4",
"jade": "*"
}

I'm having troubles with this solution:
express still try to load index.jade instead of index.html, but if I enter localhost:3000/index.html express render correctly.
I solved removing this line from app.js:
//app.get('/', routes.index);
Hope this helps. Thanks for sharing,
D.

Here's a compilation of steps others have suggested previously, but all in one, in numbered steps. This is based on versions: Yeoman 1.0.4 & Express 3.3.8.
1) Create your project directory and cd into it
2) Install angular:
yo angular
(will need to run the next two lines if you're not logged in as su)
bower install
sudo npm install
3) Rename package.json to package_yo.json
(so it's not overwritten by express' version of package.json)
4) Install Express
express -c less -Hs .
(or whatever other express options you desire)
sudo npm install
5) Delete Express' public directory & change 'public' to 'app' for paths in Express' app.js:
app.use(require('less-middleware')({ src: _dirname + '/app' }));
app.use(express.static(path.join(_dirname, 'app')));
6) Delete express' default route ( app.get('/', routes.index); )
(now express will use the routes specified in angular's /app folder instead
7) Start the server
npm start
(Then you should see Yeoman's welcome page at: localhost:3000/)

Related

'Not Found' error when deploying Angular app to Heroku

Trying to deploy an Angular app to Heroku using Github, following the instructions on here: https://itnext.io/how-to-deploy-angular-application-to-heroku-1d56e09c5147
Deployment is successful, but when I open the app, I get a 'Not Found' error on the screen. Tried changing the location in 'app.use' and 'res.sendFile' a thousand times, but with no luck, for now this is my 'server.js' code:
These are my app.use and res.sendFile functions:
app.use(express.static(__dirname + '/dist/app_name'));
res.sendFile(path.join(__dirname + '/dist/app_name/index.html'));
Folder structure:
├── angular.json
├── browserslist
├── e2e
├── karma.conf.js
├── node_modules
├── package.json
├── package-lock.json
├── README.md
├── server.js
├── src
├── app
│   ├── assets
│   ├── environments
│   ├── favicon.ico
│   ├── index.html
│   ├── main.ts
│   ├── polyfills.ts
│   ├── styles.css
│   └── test.ts
├── tsconfig.app.json
├── tsconfig.json
├── tsconfig.spec.json
└── tslint.json
My guess would be that my deployment can't locate my index.html in the src folder, but I haven't got any more ideas what path to provide..
Tried removing the '_dirname' in both functions, but still the same problem.
Would highly appreciate all the suggestions.
replace this:
app.use(express.static(__dirname + '/dist/app_name'));
res.sendFile(path.join(__dirname + '/dist/app_name/index.html'));
with:
app.use(express.static(path.join(__dirname, 'dist','app_name'));
res.sendFile(path.join(__dirname,'dist','app_name','index.html'));

How to add front end to already deployed backend project (same repo)

I currently have a Node.js project with this file structure:
strava-descriptions/
├── .DS_Store
├── .env
├── .eslintrc.js
├── .git
├── .gitignore
├── authorizeStrava.js
├── buildDescription.js
├── config.js
├── db.js
├── getActivity.js
├── getSongsPlayedDuringActivity.js
├── getSpotifyAccessToken.js
├── getSpotifyRecentlyPlayed.js
├── getStravaAccessToken.js
├── getWeatherConditions.js
├── handleWebhookEvent.js
├── node_modules
├── package-lock.json
├── package.json
├── server.js
└── updateDescription.js
The parent folder strava-descriptions is its own GitHub repository and is also deployed to Heroku.
What I want to have happen is to put all of these files into a sub-directory called backend, and create a new frontend folder in strava-descriptions to house a React front end. However, I know that using create-react-app will create its own git repo inside the frontend folder.
My question is, how do I accomplish this without totally messing up my Heroku deployment and current GitHub repo? Ideally I would like to have one complete project on GitHub (frontend and backend together), but have them deployed and functioning as two separate apps.
One approach is to use create-react-app to initialize you project and then just paste the files on your old repository, reorganize the files and then you can manage you builds for react with npm

express serve index.html from create-react-app

for special Heroku purposes, I need to deploy the solution which would redirect all routes to create-react-app index.html.
$ tree -L 2 -I 'node_modules|temp|semantic|build'
.
├── package.json
├── package-lock.json
├── public
│   ├── favicon.ico
│   ├── index.html // all requests from "redirect" express app should point to this file
│   ├── libs
│   ├── manifest.json
│   └── semantic.css
├── README.md
├── redirect // express app
│   ├── app.js
│   ├── bin
│   ├── package.json
│   ├── public
│   ├── views
│   └── yarn.lock
├── semantic.json
├── src
│   ├── appConfig.js
│   ├── assets
│   ├── components
│   ├── index.js
│   ├── index.scss
│   ├── old
│   ├── pages
│   ├── serviceWorker.js
│   └── utils
├── yarn.lock
└── yarn-error.log
the redirect directory contains the express app where I need to redirect every request to index.html
everything is fine but in the index.html there is env variable %PUBLIC_URL% which would fail with error below when I run npm start from redirect folder
pandemic#bar ~/foo/redirect
$ npm start
> redirect#0.0.0 start <path>\redirect
> node ./bin/www
URIError: Failed to decode param '/%PUBLIC_URL%/libs/pdfmake/pdfmake.min.js'
How to resolve this issue?
note: I am using windows

npm install: Is there a way to ignore a particular dependency in package.json

I am currently trying to create a docker container for a node.js project that contains a local dependency. This seems to cause an issue with docker so as a workaround I am trying to just copy the local dependency folders and just ignore their dependency entries in the package.json file. Is there a way to specify dependencies I would like to ignore and have npm install run and skip those enties?
That can be done using devDependencies
The npm modules which you require only to develop, e.g.: unit tests, Coffeescript to Javascript transpilation, minification etc,make the required module a devDependency.
To skip Installation of devDepenencies pass --production flag to npm install,with the --production flag(or NODE_ENV environment variable set to production) npm will not install modules listed in devDependencies."
npm install --production
To make any module to be part of devDependencies pass --dev while installing.
npm install packagename --save-dev
It is a common issue, not only with Docker, but also with some cloud deployments. For example deployment to CloudFoundry using standard Node.js buildpack will cause npm install/yarn to run anyway. So, you'll also need to apply some tricks to work with local modules
If you don't mind to switch from NPM to Yarn for dependency management, you can use workspaces feature.
My package.json looks like this:
{
...
"dependencies": {
"some-module-i-want-to-install": "1.0.0",
"another-module-i-want-to-install": "1.0.0",
"#my/local-dependency-one": "1.0.0",
"#my/local-dependency-two": "1.0.0"
},
"workspaces": ["packages/*"]
}
And my project source layout has the following structure:
.
├── index.js
├── package.json
├── packages
│   ├── local-dependency-one
│   │   ├── index.js
│   │   └── package.json
│   └── local-dependency-two
│      ├── index.js
│      └── package.json
└── yarn.lock
After running yarn, modules I want to install are fetched from NPM registry, and local dependencies are installed from packages directory to node_modules.
.
├── index.js
├── node_modules
│   ├── #my
│   │ ├── local-dependency-one
│   │ │ └── ...
│   │ └── local-dependency-two
│   │ └── ...
│   ├── another-module-i-want-to-install
│   │ └── ...
│   └── some-module-i-want-to-install
│   └── ...
├── package.json
├── packages
│   ├── local-dependency-one
│   │   └── ...
│   └── local-dependency-two
│      └── ...
└── yarn.lock
As you can see, I prefer to define my local packages as scoped (#my/...). It is not mandatory, but a best practice. NPM treats scoped packages as private by default, so I don't need to worry that they will be occasionally published or explicitly mark them as private.

How to organize a large single repo node.js app

I have a node.js app using a single git repo, that has various packages. I am trying to make things modularized, and separate.
├── common
│   └── formattr
│   ├── node_modules
│   ├── package.json
│ └── formattr.js
└── providers
├── aws
│   ├── node_modules
│   └── package.json
└── google
├── node_modules
└── package.json
The problem I am running into is that when somebody clones the app, they have to recurse into each package direction and manually run npm install. Additionally, there is lots of wasted resources and duplication, since the package aws might use npm install request but so does the google package. Right now, they both store independ versions.
Finally, there is this problem as well:
// Inside of the aws package, I need formattr. This makes me cry inside.
let format = require('../../common/formattr/formattr');
What is the recommended pattern and structure?

Resources