./my_module.js
var msg = "x:"; //private
var f = function(x) {
return msg + " " + x;
}
module.exports.f = f; //public
Export module functions making them part of module.exports
var module = require('module'); //library module
var my_module = require('./my_module'); //local module
console.log(my_module.f("hello"));
Import modules with require
package.json
./package.json
{
"name": "my-app",
"description": "My Web Application",
"version": "0.0.1",
"dependencies": {
"express": "4.x"
}
}
dependencies
lists the required modules and their version
npm
The Node Package Manager helps you to:
npm init
interactively create a new package.json
npm install
download and install the dependencies
npm install package --save
download and install the package
and add it to the dependencies listed in package.json
var express = require('express');
var app = express();
app.get('/',
function(req, res) { db.findAll(function(error, model) {
res.render('view', model);
}) });
app.listen(8888);
var router = express.Router();
router.METHOD('URI Template', callback)
METHOD = {get, put, post, delete, all}
app.use('URI', router);
Activate the router under the 'URI'
path
router.get('/user/:id',
function(req, res){
res.send('user ' + req.params.id);
});
router.get('/file/*.*',
function(req, res){
res.send('file path: ' + req.params);
});
var bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
app.put('/blog/:year/:id?', //? optional
function(req, res){
var year = req.params.year;
var id = req.params.id || 0; //default 0
var body = req.body;
});
Content-Type: application/json
if (req.is("application/json")) {
//request body is JSON
}
Accept: text/html
//request asks for HTML content in the response
if (req.accepts("html")) {
//set Response Content-Type Header
res.type("text/html");
}
Content-Type: text/html
How to run the same code for all requests?
Use a middleware function, which can intercept, modify and validate all requests
app.use(function(req, res, next) {
//intercept the request
console.log(req.method+" "+req.url);
//do not forget to call next
next();
});
middleware can be attached to a specific router
router.use(function(req, res, next){...});
Reusable middleware: body-parser cookie-parser method-override serve-static Morgan (Logging).
function(model) { return html }
Views are template files that present content to the user: variables, arrays and objects that are used in views are passed by the controller to be rendered by the view.
Views should not contain complex business logic; only the elementary control structures necessary to perform particular operations, such as the iteration over collections, and simple filters.
function(model) {
var html = [];
html.push('<html><body>');
if (model.user) {
html.push('<h2>' + model.user.name + '</h2>');
}
html.push('</body></html>');
return html.join();
}
res.render('view template', { model } );
Invoke a template to render the view
res.render('index.dust', { model } );
res.render('index.ejs', { model } );
Explicitly choose the template engine to use
app.set('view engine', 'dust');
res.render('index', { model } );
Configure express to choose the default template engine
Embedded JavaScript allowed
Logic-less templates
Logic-less code more likely to work both on client and server-side
app.js
var model = {
user: { name: 'CP' }
};
res.render('index.ejs', model );
index.ejs
<html><body>
<% if (user) { %>
<h2><%=user.name %></h2>
<% } %>
</body></html>
Result
<html><body>
<h2>CP</h2>
</body></html>
.ejs
<h1><%= title %></h1>
<ul>
<% for(var i=0; i<list.length; i++) {%>
<li><%= link_to(list[i],
‘users/'+list[i]) %></li>
<% } %>
</ul>
<% %>
is executed<%= %>
adds the result to the HTMLapp.js
var model = {
user: { name: 'CP' }
};
res.render('index.dust', model );
index.dust
<html><body>
{?user}
<h2>{user.name}</h2>
{/user}
</body></html>
Result
<html><body>
<h2>CP</h2>
</body></html>
app.js
var model = { title: "Hello World",
list: ["a", "b"] };
res.render("list.dust", model);
.dust
<h1>{title}</h1>
<ul>
{#list}
<li><a href="users/{.}">{.}</a></li>
{/list}
</ul>
{#}{/}
for each
{.}
current array element
A collection is a set of JSON objects, which may or may not have the same structure
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/db');
// The MongoDB Server should be running
// for the connection to work
var CommentsSchema = new mongoose.Schema ({
person : String
, comment : { type: String, required: true }
, created_at : { type: Date, default: Date.now }
});
By default fields are optional (required: false
)
var PostSchema = new mongoose.Schema({
_id : mongoose.Types.ObjectId
, author: String
, title : String
, body : String
, created_at : Date
, comments : [CommentsSchema]
});
//Create the Collection ‘Post’ using Schema
mongoose.model('Post', PostSchema);
var Post = mongoose.model('Post');
Post.find({},
function (err, posts) {
//for each post in posts
});
Post.findById(id,
function (err, post) {
if (!err) { //found post with id
}
});
Post.find({}, {title: 1}
function (err, posts) {
//for each post in posts
//the post will only include
//_id, title
});
Post.find({}, {title: 0}
function (err, posts) {
//for each post in posts
//the post will only include
//_id, author, body, created_at, comments
});
Control which fields to include (1) or exclude (0)
Save also works with updates
var post = new Post(
{ title: params['title'],
body: params['body'],
created_at: new Date() });
post.save(function (err) { //save failed
});
Post.findById(id,
function (err, post) {
if (!err) {
post.remove(function (err, removed) {
if (err) throw err;
//post successfully removed
});
}
});
var schema = new Schema(..);
schema.pre('save', function (next) {
// here 'this' refers to the object being saved
// do something before saving 'this'
// call the next middleware
next();
});
schema.post('save', function (doc) {
// 'doc' refers to the object that has been saved
// do something after saving 'doc'
});
Events can be 'init'
, 'validate'
, 'save'
, 'remove'
Use a spacebar or arrow keys to navigate