Forms 试图弄清楚如何使用mongodb、node和html从客户端到服务器端以及反过来使用表单?

Forms 试图弄清楚如何使用mongodb、node和html从客户端到服务器端以及反过来使用表单?,forms,node.js,mongodb,Forms,Node.js,Mongodb,我是这里的初学者。我目前正在使用twitter引导(html、css、js),node.js用于服务器端,mongodb用于无sql数据库。我一直在看一大堆东西,我在寻找一个答案或任何方向,如何着手有一个表单,即用户帐户注册填写在html端(已经这样做了) 它位于routes文件夹中,在我的server.js文件中作为require('./routes/home.js)调用 <code> var express = require('express') , home = re

我是这里的初学者。我目前正在使用twitter引导(html、css、js),node.js用于服务器端,mongodb用于无sql数据库。我一直在看一大堆东西,我在寻找一个答案或任何方向,如何着手有一个表单,即用户帐户注册填写在html端(已经这样做了)

它位于routes文件夹中,在我的server.js文件中作为require('./routes/home.js)调用

<code>
  var express = require('express')
  , home = require('./routes/home.js')
  , path = require('path')
  , http = require('http')
  , mongoose = require('mongoose');

 mongoose.connect('mongodb://localhost/test');


app.post('/signUp', home.signUpUser);
我在package.json文件中将mongoose作为一个依赖项,并试图找到更多关于它的文档,这非常令人困惑

我的视图引擎使用的是html(不是jade或ejs),尽管我愿意使用它们,但它们很容易理解

我直接从我的电脑上运行mongo,但我一直在研究mongohq,以使事情变得更简单

基本上,如果有人可以帮助我或指导我如何填写表单,以便将信息放入(POST)mongo中的db中,然后从mongo中取出(GET),并作为用户配置文件提供到页面上

另一件我可能需要澄清的事情是如何让它显示在新页面上,如我的个人资料页面(我是否必须创建模板/页面,或者如何将为创建帐户而保存的信息链接到我的个人资料页面)

使用HTML、JS(jQuery,JSON)、Node.JS和Mongodb指导从客户端到服务器端的整个表单过程,包括POST(表单)和GET(到新页面)


更新

所以在这里,我尝试了这篇文章,所以现在它是工作的,但得到一个找不到html模块错误

这是我的server.js文件的代码

<code>
  var express = require('express')
  , home = require('./routes/home.js')
  , path = require('path')
  , http = require('http')
  , mongoose = require('mongoose');

 mongoose.connect('mongodb://localhost/test');


app.post('/signUp', home.signUpUser);
----现在这是my home.js(又名路由器js文件)

在您的表单中,“action”是应该发出请求的url,例如
action=“/signup”

我假设您在示例中使用的是express(来自
res.render
调用)

使用express,您需要将
bodyParser
中间件添加到您的middlewarestack中,包括:

app.use(express.bodyParser());

在此之后,您需要邮政路线:

app.post('/signup',routes.postedSignup);

routes.postedSignup
可能如下所示:

exports.postedSignup = function (req, res, next) {
    if (req.body && req.body.email && req.body.password === req.body.confirmPassword) {
        var obj = {
            firstName: req.body.firstName || 'na',
            lastName: req.body.lastName || 'na',
            email: req.body.email,
            password: bcrypt.hashSync(req.body.password, 8),
            phone: req.body.phoneNumber || '555-555-555',
            birthday: new Date(req.body.birthday) || new Date()
        };
        db.userCollection.insert(obj, function (err) {
            if (!err) {
                res.redirect('/login');
            } else {
                next(err);
            }
        });
    } else {
        next(new Error('Incorrect POST'));
    }
};
在这里,
db
应该是您的数据库驱动程序,
bcrypt
是用随机盐散列密码的模块

要从数据库中获取此数据,您需要为其创建路由:

app.get('/profile/:email',routes.getProfile);

然后,该路由看起来类似于这样(假定用户已登录,并且存在有效会话,并且用户数据保存为
req.session.user
):

要使来自
res.locals.user
的数据可用,您需要使用某种模板将数据注入
res.render
。任何设置为
res.locals
(或作为对象传递到渲染调用中)的值都可以在模板中使用,在这种情况下,您要访问的变量将被称为
user

next()
调用将错误传递给errorhandler,我认为您的中间件中的errorhandler是最后一个。如果没有,你应该读一读

您还可以使用客户端模板处理这种情况,因此您只需从路由返回json,而不呈现任何模板。为此,您只需将
res.render
替换为
res.json
,并将模板名称替换为希望作为json发送的对象

对于真实世界的应用程序,您必须进一步充实这一点,例如检查是否没有用户已经使用相同的电子邮件等。注册可以分为两个不同的功能,以便可以重用另一个功能来编辑用户配置文件

还包括
express.csrf
到您的中间件,以保护用户免受csrf攻击


希望这能让你继续。

嘿,看看我的更新,仍然有问题。。。我还没有搞乱hash或bcrypt,但是will,只是想先让它工作起来。如果你注意到一些我没有意识到的事情,请告诉我。Nevermind让它工作,现在开始加密密码,然后执行get。谢谢
<code>
var mongoose = require('mongoose');

var conn = mongoose.connection;
exports.index = function(req, res){
  res.render('index');
};

exports.signUp = function(req, res){
  res.render('signUp');
};

exports.about = function(req, res) {
    res.render('about');
};


exports.signUpUser = function (req, res, next) {
if (req.body && req.body.email && req.body.password === req.body.confirmPassword) {
    var obj = {
        firstName: req.body.firstName || 'na',
        lastName: req.body.lastName || 'na',
        email: req.body.email,
        password: req.body.password,
        phone: req.body.phoneNumber || '555-555-555',
        birthday: new Date(req.body.birthday) || new Date()
    };
    conn.collection('users').insert(obj, function (err) {
        if (!err) {
            res.redirect('/about.html');
        } else {
            next(err);
        }
    });
} else {
    next(new Error('Incorrect POST'));
}
};
exports.postedSignup = function (req, res, next) {
    if (req.body && req.body.email && req.body.password === req.body.confirmPassword) {
        var obj = {
            firstName: req.body.firstName || 'na',
            lastName: req.body.lastName || 'na',
            email: req.body.email,
            password: bcrypt.hashSync(req.body.password, 8),
            phone: req.body.phoneNumber || '555-555-555',
            birthday: new Date(req.body.birthday) || new Date()
        };
        db.userCollection.insert(obj, function (err) {
            if (!err) {
                res.redirect('/login');
            } else {
                next(err);
            }
        });
    } else {
        next(new Error('Incorrect POST'));
    }
};
exports.getProfile = function (req, res, next) {
    if (req.session.user && req.session.user.email === req.params.email || req.session.user.admin) {
        db.userCollection.findOne({ email: req.params.email }, function (err, result) {
            if (!err && result) {
                res.locals.user = result;
                res.render('userprofile');
            } else {
                var errorMessage = err || new Error('no user found');
                next(errorMessage);
            }
        });
    } else {
        next(new Error('Insufficient permissions'));
    }
};