Web 开发学习笔记 - SbyS: Node.js Express MongoDB
Table of Contents
1 Note
1.1 Install
- Node.js
- Express Generator: npm install -g express-generator
- Express Project: express nodetest1
- Dependencies
Edit: package.json
"dependencies": { "body-parser": "~1.16.0", "cookie-parser": "~1.4.3", "debug": "~2.6.0", "express": "~4.14.1", "jade": "~1.11.0", "mongodb": "^2.2.25", "monk": "^4.0.0", "morgan": "~1.7.0", "serve-favicon": "~2.3.2" }
- Install: $nodetest1> npm install (->
node_modules/
)- still have to install the actual module inside this one particular project
- Database: $nodetest1> mkdir data
- Test web server: $nodetest1> npm start (-> http://localhost:3000)
1.2 Hello World!
app.js
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 forwarding 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;
>> routes.js
var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function(req, res) { res.render('index', { title: 'Express' }); }); /* GET Hello World page. */ router.get('/helloworld', function(req, res) { res.render('helloworld', { title: 'Hello, World!' }); }); module.exports = router;
+ .jade (-> http://localhost:3000/helloworld)
extends layout block content h1= title // p Welcome to #{title} p Hello, World! Welcome to #{title}
1.3 DB
Data form
{ "_id" : 1234, "username" : "cwbuecheler", "email" : "cwbuecheler@nospam.com" }
- MongoDB
- Install: http://mongodb.org/
- Run:
- mongod –dbpath nodetest1\
- mongo
- use nodetest1
- db.usercollection.insert({ "username" : "testuser1", "email" : "testuser1@testdomain.com" })
- db.usercollection.find().pretty()
- —
- newstuff = [{ "username" : "testuser2", "email" : "testuser2@testdomain.com" }, { "username" : "testuser3", "email" : "testuser3@testdomain.com" }]
- db.usercollection.insert(newstuff);
- DB->
>> app.js
// after: var bodyParser = require('body-parser'); var mongo = require('mongodb'); var monk = require('monk'); var db = monk('localhost:27017/nodetest1'); // Make our db accessible to our router app.use(function(req,res,next){ req.db = db; next(); }); // above: app.use('/', routes);
>> routes.js
/* GET Userlist page. */ router.get('/userlist', function(req, res) { var db = req.db; var collection = db.get('usercollection'); collection.find({},{},function(e,docs){ res.render('userlist', { "userlist" : docs }); }); });
+ .jade (-> http://localhost:3000/userlist)
extends layout block content h1. User List ul each user, i in userlist li a(href="mailto:#{user.email}")= user.username
- DB<-
>> routes/index.js
/* GET New User page. */ router.get('/newuser', function(req, res) { res.render('newuser', { title: 'Add New User' }); }); // above: module.exports
+ views.jade (-> http://localhost:3000/newuser)
extends layout block content h1= title form#formAddUser(name="adduser",method="post",action="/adduser") input#inputUserName(type="text", placeholder="username", name="username") input#inputUserEmail(type="text", placeholder="useremail", name="useremail") button#btnSubmit(type="submit") submit
>> routes.js
/* POST to Add User Service */ router.post('/adduser', function(req, res) { // Set our internal DB variable var db = req.db; // Get our form values. These rely on the "name" attributes var userName = req.body.username; var userEmail = req.body.useremail; // Set our collection var collection = db.get('usercollection'); // Submit to the DB collection.insert({ "username" : userName, "email" : userEmail }, function (err, doc) { if (err) { // If it failed, return error res.send("There was a problem adding the information to the database."); } else { // And forward to success page res.redirect("userlist"); } }); }); // above: moudle.exports