diff --git a/README.md b/README.md index b4ef96a8ea..48b8598498 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,38 @@ -## Google Cloud Platform NodeJS Samples +# Google Cloud Platform NodeJS Samples -This repository holds the samples used in the nodejs documentation on [cloud.google.com](https://cloud.google.com). +This repository holds the samples used in the nodejs documentation on [cloud.google.com/nodejs](https://cloud.google.com/nodejs). [![Build Status](https://travis-ci.org/GoogleCloudPlatform/nodejs-docs-samples.svg)](https://travis-ci.org/GoogleCloudPlatform/nodejs-docs-samples) -See our other [Google Cloud Platform github -repos](https://github.com/GoogleCloudPlatform) for sample applications and -scaffolding for other frameworks and use cases. +## Google App Engine + +This is a collection of samples and instructions to run common nodejs frameworks and applications on [Google App Engine](http://cloud.google.com/nodejs). + +### Frameworks + +- [Express](appengine/express/) +- [Hapi](appengine/hapi/) +- [Loopback](appengine/loopback/) +- [Sails](appengine/sails/) +- [Koa](appengine/koa/) +- [Kraken](appengine/kraken/) +- [Restify](appengine/restify/) +- [Geddy](appengine/geddy/) + +### Services + +- [Redis](appengine/redis/) + +### Tools + +- [Grunt](appengine/grunt/) + +### More information + +- [Getting started with nodejs on Google Cloud](http://cloud.google.com/nodejs/) +- See our other [Google Cloud Platform github repos](https://github.com/GoogleCloudPlatform) for sample applications and scaffolding for other frameworks and use cases. +- [Using the `gcloud` npm module](https://googlecloudplatform.github.io/gcloud-node/#/) +- [Logging to Google Cloud with Winston](https://github.com/GoogleCloudPlatform/winston-gae) ## Contributing changes diff --git a/appengine/README.md b/appengine/README.md new file mode 100644 index 0000000000..10a0953ea9 --- /dev/null +++ b/appengine/README.md @@ -0,0 +1,29 @@ +# nodejs -> Google App Engine + +This is a collection of samples and instructions to run common nodejs frameworks and applications on [Google App Engine](http://cloud.google.com/nodejs). + +## Frameworks + +- [Express](express/) +- [Hapi](hapi/) +- [Loopback](/loopback) +- [Sails](sails/) +- [Koa](koa/) +- [Kraken](kraken/) +- [Restify](restify/) +- [Geddy](geddy/) + +## Services + +- [Redis](redis/) + +## Tools + +- [Grunt](grunt/) + +## More info + +- [Getting started with nodejs on Google Cloud](http://cloud.google.com/nodejs/) +- [Using the `gcloud` npm module](https://googlecloudplatform.github.io/gcloud-node/#/) +- [Logging to Google Cloud with Winston](https://github.com/GoogleCloudPlatform/winston-gae) + \ No newline at end of file diff --git a/appengine/express/README.md b/appengine/express/README.md new file mode 100644 index 0000000000..63c42068f3 --- /dev/null +++ b/appengine/express/README.md @@ -0,0 +1,25 @@ +# Express -> Google App Engine + +This is a simple guide to running [expressjs](http://expressjs.com/) on Google App Engine. + +1. [Create a new Express app](http://expressjs.com/starter/generator.html) + +2. Create an `app.yaml` in the root of your application with the following contents: + + ```yaml + runtime: nodejs + vm: true + env_variables: + PORT: 8080 + ``` + +3. Deploy your app. For convenience, you can use an npm script to run the command. Modify your `package.json` to include: + + ```js + "scripts": { + "start": "node ./bin/www", + "deploy": "gcloud preview app deploy app.yaml --set-default --project [project id]" + } + ``` + + At the terminal you can now run `npm run deploy` to deploy your application. diff --git a/appengine/express/app.js b/appengine/express/app.js new file mode 100644 index 0000000000..01ad7490b2 --- /dev/null +++ b/appengine/express/app.js @@ -0,0 +1,60 @@ +var express = require('express'); +var path = require('path'); +var favicon = require('serve-favicon'); +var logger = require('morgan'); +var cookieParser = require('cookie-parser'); +var bodyParser = require('body-parser'); + +var routes = require('./routes/index'); +var users = require('./routes/users'); + +var app = express(); + +// view engine setup +app.set('views', path.join(__dirname, 'views')); +app.set('view engine', 'jade'); + +// uncomment after placing your favicon in /public +//app.use(favicon(__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('/', routes); +app.use('/users', users); + +// 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 handlers + +// development error handler +// will print stacktrace +if (app.get('env') === 'development') { + app.use(function(err, req, res, next) { + res.status(err.status || 500); + res.render('error', { + message: err.message, + error: err + }); + }); +} + +// production error handler +// no stacktraces leaked to user +app.use(function(err, req, res, next) { + res.status(err.status || 500); + res.render('error', { + message: err.message, + error: {} + }); +}); + + +module.exports = app; diff --git a/appengine/express/app.yaml b/appengine/express/app.yaml new file mode 100644 index 0000000000..771d26e266 --- /dev/null +++ b/appengine/express/app.yaml @@ -0,0 +1,5 @@ +runtime: nodejs +api_version: 1 +vm: true +env_variables: + PORT: 8080 \ No newline at end of file diff --git a/appengine/express/bin/www b/appengine/express/bin/www new file mode 100755 index 0000000000..05cf405e72 --- /dev/null +++ b/appengine/express/bin/www @@ -0,0 +1,90 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var app = require('../app'); +var debug = require('debug')('express:server'); +var http = require('http'); + +/** + * Get port from environment and store in Express. + */ + +var port = normalizePort(process.env.PORT || '3000'); +app.set('port', port); + +/** + * Create HTTP server. + */ + +var server = http.createServer(app); + +/** + * Listen on provided port, on all network interfaces. + */ + +server.listen(port); +server.on('error', onError); +server.on('listening', onListening); + +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val) { + var port = parseInt(val, 10); + + if (isNaN(port)) { + // named pipe + return val; + } + + if (port >= 0) { + // port number + return port; + } + + return false; +} + +/** + * Event listener for HTTP server "error" event. + */ + +function onError(error) { + if (error.syscall !== 'listen') { + throw error; + } + + var bind = typeof port === 'string' + ? 'Pipe ' + port + : 'Port ' + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } +} + +/** + * Event listener for HTTP server "listening" event. + */ + +function onListening() { + var addr = server.address(); + var bind = typeof addr === 'string' + ? 'pipe ' + addr + : 'port ' + addr.port; + debug('Listening on ' + bind); +} diff --git a/appengine/express/package.json b/appengine/express/package.json new file mode 100644 index 0000000000..806153c5f9 --- /dev/null +++ b/appengine/express/package.json @@ -0,0 +1,18 @@ +{ + "name": "express", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "node ./bin/www", + "deploy": "gcloud preview app deploy app.yaml --set-default --project express-demo" + }, + "dependencies": { + "body-parser": "~1.12.4", + "cookie-parser": "~1.3.5", + "debug": "~2.2.0", + "express": "~4.12.4", + "jade": "~1.9.2", + "morgan": "~1.5.3", + "serve-favicon": "~2.2.1" + } +} \ No newline at end of file diff --git a/appengine/express/public/stylesheets/style.css b/appengine/express/public/stylesheets/style.css new file mode 100644 index 0000000000..30e047daef --- /dev/null +++ b/appengine/express/public/stylesheets/style.css @@ -0,0 +1,8 @@ +body { + padding: 50px; + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; +} + +a { + color: #00B7FF; +} \ No newline at end of file diff --git a/appengine/express/routes/index.js b/appengine/express/routes/index.js new file mode 100644 index 0000000000..9b3986c601 --- /dev/null +++ b/appengine/express/routes/index.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET home page. */ +router.get('/', function(req, res, next) { + res.render('index', { title: 'Express |2|' }); +}); + +module.exports = router; diff --git a/appengine/express/routes/users.js b/appengine/express/routes/users.js new file mode 100644 index 0000000000..623e4302be --- /dev/null +++ b/appengine/express/routes/users.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET users listing. */ +router.get('/', function(req, res, next) { + res.send('respond with a resource'); +}); + +module.exports = router; diff --git a/appengine/express/views/error.jade b/appengine/express/views/error.jade new file mode 100644 index 0000000000..51ec12c6a2 --- /dev/null +++ b/appengine/express/views/error.jade @@ -0,0 +1,6 @@ +extends layout + +block content + h1= message + h2= error.status + pre #{error.stack} diff --git a/appengine/express/views/index.jade b/appengine/express/views/index.jade new file mode 100644 index 0000000000..3d63b9a044 --- /dev/null +++ b/appengine/express/views/index.jade @@ -0,0 +1,5 @@ +extends layout + +block content + h1= title + p Welcome to #{title} diff --git a/appengine/express/views/layout.jade b/appengine/express/views/layout.jade new file mode 100644 index 0000000000..b945f5776e --- /dev/null +++ b/appengine/express/views/layout.jade @@ -0,0 +1,7 @@ +doctype html +html + head + title= title + link(rel='stylesheet', href='/stylesheets/style.css') + body + block content \ No newline at end of file diff --git a/appengine/geddy/.gitignore b/appengine/geddy/.gitignore new file mode 100644 index 0000000000..28aaf8d70e --- /dev/null +++ b/appengine/geddy/.gitignore @@ -0,0 +1,10 @@ +*.swp +*.swo +dist +node_modules +*.DS_Store +log/ +npm-debug.log +config/secrets.json +public/js/core/models.js +public/js/core/helpers.js diff --git a/appengine/geddy/Jakefile b/appengine/geddy/Jakefile new file mode 100644 index 0000000000..97a84a6f12 --- /dev/null +++ b/appengine/geddy/Jakefile @@ -0,0 +1,6 @@ + +var t = new jake.TestTask('geddy', function () { + this.testFiles.include('test/*.js'); + this.testFiles.include('test/**/*.js'); +}); + diff --git a/appengine/geddy/README.md b/appengine/geddy/README.md new file mode 100644 index 0000000000..3c2594d89b --- /dev/null +++ b/appengine/geddy/README.md @@ -0,0 +1,38 @@ +# Geddy -> Google App Engine + +This is a simple guide to running [geddy](http://geddyjs.org/) on Google App Engine. + +1. [Create a new geddy app](http://geddyjs.org/tutorial). + +2. Create an `app.yaml` in the root of your application with the following contents: + + ```yaml + runtime: nodejs + vm: true + api_version: 1 + env_variables: + PORT: 8080 + ``` + +3. Create a `server.js` that contains the following code: + + ```js + var geddy = require('geddy'); + + geddy.start({ + port: process.env.PORT || '3000' + }); + ``` + +4. Run `npm install --save geddy` + +5. Deploy! For convenience, you can modify your `package.json` to use an npm script for deployment: + + ```js + "scripts": { + ... + "deploy": "gcloud preview app deploy app.yaml --set-default --project [project id]" + } + ``` + + At the terminal you can now run `npm run deploy` to deploy your application. diff --git a/appengine/geddy/_session_store.json b/appengine/geddy/_session_store.json new file mode 100644 index 0000000000..f3a0830f5e --- /dev/null +++ b/appengine/geddy/_session_store.json @@ -0,0 +1 @@ +{"Ln54fnyKo1FzNDpn7DPWhqOclmjjPTbm6K9XyCrSQbny9s1o8EJgLVxCILDEfKK7YUk4mcEcwsQmxyWwJ90ocQGEYB21aYTrl6qlljiPidZxikwV8Kt6RxlDlqcKb2jh":{"accessTime":1439584930407,"flashMessages":{}}} \ No newline at end of file diff --git a/appengine/geddy/app.yaml b/appengine/geddy/app.yaml new file mode 100644 index 0000000000..75be7247b3 --- /dev/null +++ b/appengine/geddy/app.yaml @@ -0,0 +1,5 @@ +runtime: nodejs +vm: true +api_version: 1 +env_variables: + PORT: 8080 \ No newline at end of file diff --git a/appengine/geddy/app/controllers/application.js b/appengine/geddy/app/controllers/application.js new file mode 100644 index 0000000000..f627ebc1cb --- /dev/null +++ b/appengine/geddy/app/controllers/application.js @@ -0,0 +1,25 @@ +/* + * Geddy JavaScript Web development framework + * Copyright 2112 Matthew Eernisse (mde@fleegix.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +var Application = function () { +}; + +exports.Application = Application; + + + diff --git a/appengine/geddy/app/controllers/main.js b/appengine/geddy/app/controllers/main.js new file mode 100644 index 0000000000..1bf2c70f89 --- /dev/null +++ b/appengine/geddy/app/controllers/main.js @@ -0,0 +1,30 @@ +/* + * Geddy JavaScript Web development framework + * Copyright 2112 Matthew Eernisse (mde@fleegix.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +var Main = function () { + this.index = function (req, resp, params) { + this.respond({params: params}, { + format: 'html' + , template: 'app/views/main/index' + }); + }; +}; + +exports.Main = Main; + + diff --git a/appengine/geddy/app/views/errors/default.html.ejs b/appengine/geddy/app/views/errors/default.html.ejs new file mode 100644 index 0000000000..594c13bb43 --- /dev/null +++ b/appengine/geddy/app/views/errors/default.html.ejs @@ -0,0 +1,7 @@ +
<%= stack %>
+<% } else if (typeof message != 'undefined') { %>
+<%= message %>
+<% } %>
+
diff --git a/appengine/geddy/app/views/errors/not_found.html.ejs b/appengine/geddy/app/views/errors/not_found.html.ejs
new file mode 100644
index 0000000000..1e5fba0582
--- /dev/null
+++ b/appengine/geddy/app/views/errors/not_found.html.ejs
@@ -0,0 +1,5 @@
+