【问题标题】:Retrieve data from Mongodb via form input and pug template renderer通过表单输入和 pug 模板渲染器从 Mongodb 中检索数据
【发布时间】:2016-09-07 08:21:16
【问题描述】:

我目前遇到以下问题: 我无法从我的 mongoDB 中检索任何数据并将其显示在客户端或仅显示在另一条路线上。我已经使用了几次尝试,例如:

app.get('/output', function(req, res){
  Users.find(function (err, users){
    res.render('help', {users: users});
  });
});

但是,这会以“未定义用户”结尾。 使用 mongo shell 并查询“显示集合”时,我发现“用户”集合包含来自表单输入的数据。

如果有人可以向我解释如何根据下面的代码检索数据并显示在“index.pug”中,如#{users.firstName},我将不胜感激。

App.js 代码:

var express = require('express');
var app = express();
var router = express.Router();
var mongoose = require('mongoose');
var bodyParser = require('body-parser');
var methodOverride = require('method-override');


app.get('/', function (req, res) {
  res.render('index', function(err, html) {
    res.send(html);
  });
});

app.set('view engine', 'pug');
app.set('views', __dirname + '/views');

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(methodOverride('_method'));
app.use(express.static(__dirname + '/public'));

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

var Schema = new mongoose.Schema({
  _id : String,
  firstName : String,
  lastName : String,
  City : String,
  Country : String
});

var user = mongoose.model('user', Schema);

app.post('/send', function(req, res){
  new user({
    _id: req.body.email,
    firstName: req.body.firstName,
    lastName: req.body.lastName,
    City: req.body.city,
    Country: req.body.country
  }).save(function(err, doc){
      if(err) res.json(err);
      else res.send('Successfully inserted');
  });
});

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
}); 

index.pug 代码:

doctype html
html(lang='en')
  head
    meta(charset='utf-8')
    meta(http-equiv='X-UA-Compatible', content='IE=edge')
    meta(name='viewport', content='width=device-width, initial-scale=1')
    // The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags
    // Bootstrap
    link(href='css/bootstrap.min.css', rel='stylesheet')
    // HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries
    // WARNING: Respond.js doesn't work if you view the page via file://
    //if lt IE 9
      script(src='https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js')
      script(src='https://oss.maxcdn.com/respond/1.4.2/respond.min.js')
  body
  form(action='/send' method='POST')
    | Email:
    br
    input(type='text', name='email', value='#{user.firstName}')
    br
    | First Name:
    br
    input(type='text', name='firstName', value='')
    br
    | Last Name:
    br
    input(type='text', name='lastName', value='')
    br
    | City:
    br
    input(type='text', name='city', value='')
    br
    | Country:
    br
    input(type='text', name='country', value='')
    br
    input(type='submit', value='Submit')

    // jQuery (necessary for Bootstrap's JavaScript plugins)
    script(src='https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js')
    // Include all compiled plugins (below), or include individual files as needed
    script(src='js/bootstrap.min.js')

【问题讨论】:

  • 好吧,你的模型是用户而不是用户。你在这里定义它: var user = mongoose.model('user', Schema);
  • 感谢您的贡献,我也试过了,但是它的响应是“未定义用户”。
  • 不是User,而是您的代码中定义的user(小写)。
  • 感谢您的帮助,我刚刚用以下代码重试了它:app.get('/', function(req, res){ user.find(function (err, user){ res.render ('指数'); }); }); /* 但是它不会在表单输入字段中呈现。我输入:value="#{user.firstName}"。但它没有渲染 - 我做错了什么?

标签: javascript node.js mongodb mongoose pug


【解决方案1】:

您必须使用您定义为模型var user = mongoose.model('user', Schema);user

所以 find 的正确用法是:

user.find(...)

如果您想使用Users.find,那么您应该像这样声明模型var Users = mongoose.model('user', Schema);

【讨论】:

  • 谢谢,我刚刚用这个代码重试了:app.get('/', function(req, res){ user.find(function (err, user){ res.render('index '); }); }); /* 但是它不会在表单输入字段中呈现。我输入:value="#{user.firstName}"。但它没有渲染 - 我做错了什么?
  • 那是另一个问题。我的意思是,如果您只想从数据库中输出用户,请尝试 res.json(user);。如果您想发送文件,请使用res.sendFile。阅读有关响应的快速文档。
  • 嗯,我只是尝试用 res.json(user) 渲染它;但它仍然在我的表单 value="" 字段中显示为字符串。任何其他想法,如何检索数据?
  • 好的,我现在可以使用以下代码将数据检索到我的控制台:user.find(function (err, users){ console.log(users); }); /* 但是还是不知道怎么在客户端或者表单值域中渲染 */
【解决方案2】:

一旦你拒绝放弃,奇迹就会发生。我想通了,万一有人遇到这个问题,这里是工作代码:

app.js

app.get('/retrieve', function(req, res){
    post.find({}, function(err, docs){
        if(err) res.json(err);
        else    res.render('retrieve', {posts: docs});
    });
});

index.pug

html
  head
    title Registration Form
  body
ul
each post in posts
    form(action='', method='POST')
      label(for='post[email]') Email:
      input(type='text', name="post[_id]", value=post._id)
      br
      label(for='post[name]') Name:
      input(type='text', name="post[name]", value=post.name)
      br
      label(for='post[age]') Age:
      input(type='text', name="post[age]", value=post.age)
      br
      input(type='submit')

【讨论】:

    猜你喜欢
    • 2021-12-01
    • 2018-10-08
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 2017-01-17
    • 1970-01-01
    相关资源
    最近更新 更多