Deployment of Nodejs Code with Google Cloud

304 Views Asked by At

I am trying to deploy my webapp code built on NODE JS. I deployed a simple application hello-world from

https://github.com/GoogleCloudPlatform/nodejs-docs-samples/tree/master/appengine/hello-world

and it worked.

Attached is my project structure. In the client folder i have angular4 where the build files will be stored in public In the server folder i have defined routes.

This setup is working find on my local. No errors.

But when i deploy it on google cloud i am getting

Error: Server Error

The server encountered a temporary error and could not complete your request.
Please try again in 30 seconds.

and error log says

Error: No default engine was specified and no extension was provided.
at View (/app/server/node_modules/express/lib/view.js:61)
at EventEmitter.render (/app/server/node_modules/express/lib/application.js:570)
at ServerResponse.render (/app/server/node_modules/express/lib/response.js:1008)
at (/app/server/app.js:42)
at Layer.handle_error (/app/server/node_modules/express/lib/router/layer.js:71)
at trim_prefix (/app/server/node_modules/express/lib/router/index.js:315)
at (/app/server/node_modules/express/lib/router/index.js:284)
at Function.process_params (/app/server/node_modules/express/lib/router/index.js:335)
at next (/app/server/node_modules/express/lib/router/index.js:275)
at Layer.handle_error (/app/server/node_modules/express/lib/router/layer.js:67)

Can anyone guide me on why this error?

My root package.json file to run npm start is

{
    "name": "test-application",
    "description": "A simple application for testers who run",
    "version": "0.0.1",
    "private": true,
    "license": "Apache-2.0",
    "author": "Alaksandar Jesus Gene",
    "repository": {
        "type": "git",
        "url": ""
    },
    "engines": {
        "node": ">=4.3.2"
    },
    "scripts": {
        "deploy": "gcloud app deploy",
        "start": "node server/app.js"
    },
    "dependencies": {

    },
    "devDependencies": {

    },
    "cloud-repo-tools": {
        "test": {
            "app": {
                "msg": "Hello, world!"
            }
        },
        "requiresKeyFile": true,
        "requiresProjectId": true
    }
}

And my app.yaml file is

# [START app_yaml]
runtime: nodejs
env: flex
skip_files:
  - ^client$
# [END app_yaml]

Point to note, both files were copied from google sample github project and added values.

Project Folder Structure - Expanded

Project Folder Structure - Expanded

Project Folder Structure - Collapsed

enter image description here

Can anyone guide me on why this error?

1

There are 1 best solutions below

0
On

Fixed it. My mistake in app.js coding

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
const http = require('http');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var api = require('./routes/api');

var app = express();


// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, '../public')));

app.use('/api', api);
app.get('*', (req, res) => {  //i think the issue was here. I had app.use
    res.sendFile(path.join(__dirname, '/index.html'));
});

// catch 404 and forward to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

// error handler
app.use(function(err, req, res, next) {
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    res.render('error');
});

const port = process.env.PORT || '3000';
app.set('port', port);

const server = http.createServer(app);

server.listen(port, () => console.log(`Running on localhost:${port}`));

module.exports = app;