2013-05-20 79 views
0

我想跟着這Express.js and MongoDB tutorial與使我的索引頁有一個表格,您保存一個電子郵件地址的區別。如何使用Express和Mongo製作一個簡單的表單GET和POST?

這也是迄今爲止主要代碼:

emailprovider.js

var Db = require('mongodb').Db; 
var Connection = require('mongodb').Connection; 
var Server = require('mongodb').Server; 
var BSON = require('mongodb').BSON; 
var ObjectID = require('mongodb').ObjectID; 

EmailProvider = function(host, port) { 
    this.db= new Db('email-test', new Server(host, port, {safe: false}, {auto_reconnect: true}, {})); 
    this.db.open(function(){}); 
}; 


EmailProvider.prototype.getCollection= function(callback) { 
    this.db.collection('emails', function(error, email_collection) { 
    if(error) callback(error); 
    else callback(null, email_collection); 
    }); 
}; 

//save new email 
EmailProvider.prototype.save = function(emails, callback) { 
    this.getCollection(function(error, email_collection) { 
     if(error) callback(error) 
     else { 
     if(typeof(emails.address)=="undefined") 
      emails = [emails]; 

     for(var i =0;i< emails.address;i++) { 
      email = emails[i]; 
      email.created_at = new Date(); 
     } 

     email_collection.insert(emails, function() { 
      callback(null, emails); 
     }); 
     } 
    }); 
}; 

exports.EmailProvider = EmailProvider; 

app.js

var express = require('express') 
    , routes = require('./routes') 
    , user = require('./routes/user') 
    , http = require('http') 
    , path = require('path') 
    , EmailProvider = require('./emailprovider').EmailProvider; 

var app = express(); 

app.get('/', routes.index); 
app.get('/users', user.list); 


//Routes 


//get new email form 
app.get('/email/new', function(req, res) { 
    res.render('email_new', { 
     title: 'Email Address' 
    }); 
}); 


//save new email 
app.post('/email/new', function(req, res){ 
    emailProvider.save({ 
     address: req.param('name') 
    }, function(error, docs) { 
     res.redirect('/') 
    }); 
}); 

index.js

.form-area 
    form(method='post') 
    input(type='text', name='address', placeholder='Your email address') 
    input(type='submit', value='Send') 

我真的不知道emailprovider中發生了什麼。我有點得到了路線,但現在當我嘗試保存一個新的電子郵件,我得到一個Cannot POST / 404錯誤消息。什麼是正確的方法來做到這一點?

謝謝。

編輯:在輸入屬性的玉語法中刪除額外的逗號。

回答

1

您的EmailProvider變量是對函數的引用,而不是對象實例。這可能會導致兩個問題:

  1. ,你想上EmailProvider.js的this運營商可能不是指EmailProvider。
  2. 每次撥打EmailProvider.save()將再次運行db.collection,這可能會導致性能問題,內存泄漏以及其他問題。

您應該EmailProvider創建一個對象實例如下:

var app = express(); 
var emailProvider = new EmailProvider(<some host>, <some port>); 
... 

如果this操作引起的問題(如它不承認EmailProvider方法)調用call功能save後功能如下:

//save new email 
app.post('/email/new', function(req, res){ 
    emailProvider.save({ 
     address: req.param('name') 
    }, function(error, docs) { 
     res.redirect('/') 
    }).call(emailProvider); 
}); 

希望它會有所幫助。

+0

是的,謝謝,我錯過了。我把我的主機和端口,就像在本教程中一樣var var emailProvider = new EmailProvider('localhost',27017);''和''req.param'到'('address')'而不是''name'' 。 – Jryl

相關問題