Problems with expressjs on Nodester - node.js

i just started using nodester as nodejs application paas and i stepped into a couple of problems.
Let me clarify that my local machine runs node 0.7 while on nodester i'm using node 0.6.17
The following code is inside my server.js file, executed by the platform:
app.get('/static', function(req,res) {
res.sendfile('views/myFile.html',function(error){
if(err)
res.send('An error has occurred');
});
});
app.get('/', function(req,res){
res.render('index.jade');
});
The rest of the code is the code generated by Express.js
in particular the configuration is
app.set('views', __dirname + '/views');
app.use(express.static(__dirname + '/public'));
app.set('view engine', 'jade');
app.set('view options', {layout: 'layout.jade'}); //added by me but with no results
If i run this configuration in my local machine, everything works fine, the '/' route, perfectly sends the index.jade view inside the proper layout.jade view.
The '/static' route, sends index.html without problems.
But if i run this code on nodester (after editing package.json and asking for node 0.6)
i get different results:
The '/' route doesn't render the layout.jade, but only index.jade. This is pretty weird, since i just edited the layout.jade file, generated by express!
The '/static' route just throws an error, that i can catch with the callback. So the html file is not sent.
Where am i wrong? i am probably missing something.. any ideas?

Answer for 2
In nodester the node process might be running from a different directory making process.cwd() not equal to your app's root directory.
To solve this issue, use the following code
app.get('/static', function(req,res) {
res.sendfile(__dirname + '/views/myFile.html',function(error){
if(err)
res.send('An error has occurred');
});
});
Answer for 1
Similiar problem as above. So, please check and tell me.

Related

how to run angular 6 app with nodejs api on production?

Hi I am new to angular6
In development mode I have worked in angular 4200 port and node in different port (8080) in my operations.
but now I want to move my app into production mode.
for that I had build my angular project by using ng build command. after i get a dist folder is created on the root folder.
so i went to server.js file
here I had add my static file
app.use(express.static(path.join(__dirname,'dist/MDProject')));
app.use('/',(req,res)=>{
res.sendFile(path.join(__dirname,'dist/MDProject/index.html'))
});
click here to read my server.js file
by this
when ever I redirect to my local host it is opening but
in server.js side i didn't get any response.
when ever I try to login I am getting this error.
can anyone help me to solve this
I think there are 2 things wrong here in your code.
First, update your code
From:-
app.use('/',(req,res)=>{
res.sendFile(path.join(__dirname,'dist/MDProject/index.html'))
});
To:- This code needs to be added just before your app.listen(app.get('port')) code
app.get('*', function(req, res) {
res.sendfile('./public/MDProject/index.html');
// load the single view file (angular will handle the page changes on the front-end)
});
Second, Serve your file from your public folder(In your case I think it is the dist folder). So update your code like this.
app.use(express.static(__dirname + '/dist/MDProject'));
after I removed this line in my server.js file
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
and I paste this line before port creation.
app.use(express.static(path.join(__dirname,'dist/MDProject')));
app.use('/',(req,res)=>{
res.sendFile(path.join(__dirname,'dist/MDProject/index.html'))
});
now it is working fine.
Use this to go to index page.
app.get('*', (req, res) => {
res.sendfile('./public/MDProject/index.html');
})
with that you have to make folder in public in node
app.use('/', express.static('/dist/MDProject'))
Then in your app dist folder -> index.html
<base href="http://192.168.1.1:3000/admin-panel/">
This is my working code. Let me know if you have still any issue. :)

Express + Jade: Failed to lookup view error

So i have a directory structure as following
public
views
register.jade
And under my index.js file i have set up the code for template engine with Express as follow
app.set('view engine', 'jade');
app.set('views', __dirname + '/public/views');
app.get('/', function(req, res){
res.render('register');
});
I have tried everything as far as the path structure but still keep getting the failed to lookup error
Edit: So it works when you have the views directory set out in the main path app/views instead of app/public/views. Still not understanding the underlying cause for this

Second express.static not working online

I have my code locally working well, but when I pull my code on my digitalocean web server, my code doesn't work like locally.
app.configure(function(){
app.use(express.bodyParser());
app.use(express.static(__dirname + '/dynamicApp'));
app.use(express.static(__dirname + '/staticApp'));
});
When I try to access content in /staticApp it works locally, but it doesn't on my digital ocean server. Content in the /dynamicApp work properly.
Both environment have the same node.js version (0.10.17), I have loaded with Vim my server files, and they are the same. I have done ls in all folders, and the structure is the same. I tried in incognito mode in Chrome to see if it were caching issues, and the issue is still there.
Anyone has a clue why this could happen ?
try setting the paths that serve the static content like:
app.configure(function(){
app.use(express.bodyParser());
app.use('/dynamicApp', express.static(__dirname + '/dynamicApp'));
app.use('/staticApp', express.static(__dirname + '/staticApp'));
});
express 4.x , like this:
app.use('/public', express.static(__dirname+'/public'));
app.use('/data', express.static(__dirname+'/data'));

Jade not finding view in different folder

I have a directory like this
/Workspace
/app
app.js
/lib
/public
/styles
*.css
/scripts
*.js
/views
*.jade
from app.js in app, I have the following code:
libPath = __dirname + '/../lib'
... express stuff ...
app.configure(function() {
app.set('view', libPath + '/views')
... express stuff ...
app.use(express.static(libPath + '/public'))
... rest of the app ...
Now, the problem is that Jade can't find any of the views, but all the static assets are found. Thus, app.set('view') isn't working, but express.static is. If I copy the views directory to app, using __dirname + '/views' works fine. Anyone know why this is happening?
doing app.get('view'), I get a directory like this: /Users/jong/Workspace/app/../lib/views. I tried doing the absolute route /Users/jong/Workspace/lib/views as well to no avail. It's just weird that this directory works for static assets but not templates.
You have a mistype, the correct option name is views, not view.
Configure your application like
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.set('view options', { layout: true });
But the main root of issue is that you seem to misunderstand how express (and the MVC at all) works.
express sends out the static data to the browser, using your express.static configure directive, once the request url matches the existing static file path.
Otherwise, it tries to find any defined route for the requested path and to execute the associated controller (which may or may not use the template engine in turn).
So, in order to show e.g. the index page (even if it has no parameters), given you have an index.js in your views folder, you have to do something like
app.get('/', function (req, res, next) {
res.render('index', {});
});

Expressjs not recognizing static files

I have a nodejs app and am using expressjs. I've defined my static directory, but when I access it, it doesn't load. My express config is:
var app = express.createServer().listen(8001);
app.configure(function(){
app.use(express.methodOverride());
app.use(express.bodyParser());
app.use(app.router);
app.use('/public', express.static(__dirname + '/public'));
app.use(express.cookieParser());
app.use(express.session({ secret: "appsession" }));
app.use(express.errorHandler({showStack: true, dumpExceptions: true}));
app.set('views', __dirname + '/views');
app.set('view engine', 'hbs');
});
Inside my /public directory I have 3 folders, css, js, and img. Inside css I have a style.css. When I try to access it directly via http://localhost:8001/public/css/style.css I get: Cannot GET /public/css/style.css
Any ideas what I could be doing wrong?
Thanks!
EDIT:
It seems to be related to how I have my routes setup. I'm doing it like this:
var routes = require('./routes')(db);
pp.get('/', routes.index);
Then in my index.js file, I have:
module.exports = function(db) {
return {
index: function(req, res, next) {
res.render('index');
}
}
}
I have my error handling enabled, but when I use the routing in this way, it doesn't use expresses error handling, however if I take this out, it does.
You setup the static http middleware as follows:
app.use(express.static(__dirname + '/public'));
And retrieve a file in ./public/css/style.css with the url:
"/css/style.css"
public is not part of the path when you actually request the file.
Change your static handler to this:
app.use('/public/css', express.static(__dirname + '/public/css'));
Then http://localhost:8001/public/css/style.css should get what you want
Full sample app that allows curl http://localhost:8001/public/css/style.css:
app.js
|-public
|-css
|-style.css
var express = require("express"),
app = express.createServer();
app.use('/public/css', express.static(__dirname + '/public/css'));
app.listen(8001);
Was running into the same issue found the answer here
https://github.com/senchalabs/connect/issues/298
When you have try to use nested files it kinda get lost,
it says fixed on the tracker a year ago, however i tried today and worked fine
I figured it out.
I have two services running on my host. Django is running the site at the root: http://myURL.com, and then Node is running at http://myURL.com/node
The configuration is fine with all the files in Node. The index.html file is requested fine, but the index.html when it requests the stylesheets and static files, the request gets caught by Django before it makes it to Node. Django saw the file and had no idea what it is and returned the 404 error.
By disabling Django from catching the requests to those files it all works fine.

Resources