2017-04-02 56 views
-1

所以首先,我检查了相关的question,但由于我没有使用相同的中间件,我认为这对我没有帮助。我有一个常规表单,并且它可以顺利通过req.body,并且可以打印所有表单值。然而问题是当我尝试创建一个新对象时,因为当我打印它时,它没有我分配的正确字段......?其次,当我尝试保存它时,当我通过终端检查时,它不会显示在Db中。我已经成功地运行了Mongod并连接到了正确的Db和集合,所以我很困惑。任何帮助将不胜感激!Node.JS - Mongoose不会将数据保存到MongoDB并且Object不能正确获取信息?

下面是相关代码

App.js

var express = require('express'); 
var app = express(); 
var db = require('./db.js'); 
var path = require('path'); 

var bodyParser = require('body-parser'); 
var handlebars = require('hbs'); 

var mongoose = require('mongoose'); 
var museumObj = mongoose.model('MuseumObject'); 

//For Images 
var fs = require('fs'); 
var multer = require('multer'); 
//Saves to memory storage 
var upload = multer({ storage: multer.memoryStorage({}) }); 

//Port setting 
app.set('port', (process.env.PORT || 5000)); 
app.use(express.static(__dirname + '/public')); 
app.set('view engine', 'hbs'); 
app.set('views', path.join(__dirname, 'views')); 
//app.use(bodyParser.json()); 
//app.use(bodyParser.urlencoded({ extended: false })); 

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

app.get('/AdvancedSearch', function(req, res) { 
    res.render('AdvancedSearch'); 
}); 

app.get('/AskUs', function(req, res) { 
    res.render('AskUs'); 
}); 

app.get('/Themes', function(req, res) { 
    res.render('Themes'); 
}); 

app.get('/AddObj', function(req, res) { 
    res.render('AddObj'); 
}); 

app.post('/AddObj',upload.single('pic'),function(req,res){ 
    console.log("here is the req.body"); 
    console.log(req.body); 
    var base64 = req.file.buffer.toString('base64'); 

    var dim=''; 
    if(req.body.length && req.body.width && req.body.height){ 
     dim = req.body.req.body.length +" x "+req.body.width+" x "+req.body.height 
    } 

    var newObj = new museumObj({ 
     accessionNum: req.body.accession, 
     maker: req.body.maker, 
     manufacturer: req.body.manufacturer, 
     title: req.body.title, 
     date: req.body.date, 
     medium: req.body.medium, 
     dimesions: dim, 
     marks: req.body.marks, 
     description: req.body.description, 
     pic: base64, 
    }); 
    console.log('here is the new object before calling the save function'); 
    console.log(newObj); 
    newObj.save(function(err,item, count){ 
     if (err){ 
      console.log("there is an error"); 
      console.log(err); 
     } 
     else{ 
      console.log('here is the "successfully" saved item'); 
      console.log(item); 
      //res.redirect('/'); 
     } 
    }); 

}); 

app.listen(app.get('port'), function() { 
    console.log('Node app is running on port', app.get('port')); 
}); 

Db.js

var mongoose = require('mongoose'); 
var URLSlugs = require('mongoose-url-slugs'); 


var MuseumObject = new mongoose.Schema({ 
    accessionNum: String, 
    maker: {String, default: ''}, 
    manufacturer: {String, default: ''}, 
    title: String, 
    date: {String, default: ''}, 
    medium: {String, default: ''}, 
    dimensions: {String, default: ''}, 
    marks: {String, default: ''}, 
    description: {String, default: ''}, 
    pic: {String, default: ''} 
}); 


MuseumObject.plugin(URLSlugs('title')); 
mongoose.model('MuseumObject', MuseumObject); 

// is the environment variable, NODE_ENV, set to PRODUCTION? 
if (process.env.NODE_ENV == 'PRODUCTION') { 
    console.log("in production"); 
// if we're in PRODUCTION mode, then read the configration from a file 
// use blocking file io to do this... 
var fs = require('fs'); 
var path = require('path'); 
var fn = path.join(__dirname, 'config.json'); 
var data = fs.readFileSync(fn); 

// our configuration file will be in json, so parse it and set the 
// conenction string appropriately! 
var conf = JSON.parse(data); 
var dbconf = conf.dbconf; 
} 
else { 
// if we're not in PRODUCTION mode, then use 
dbconf = 'mongodb://localhost/BKMuseum'; 
} 

mongoose.connect(dbconf); 

HTML文件

<h1>Add an Object to the Collection<h1> 

<h3> 

<form method="POST" action="AddObj" id="AddObj" enctype='multipart/form-data'> 
     *Accession #: <input type="text" name = "accession" value ="" required> 
     <BR> 
     Maker/Designer/Artist: <input type="text" name = "maker" value =""> 
     <BR> 
     Manufacturer: <input type="text" name = "manufacturer" value ="" > 
     <BR> 
     *Title: <input type="text" name = "title" value ="" required > 
     <BR> 
     {{!-- Dates can be in string format: ca. 1930 vs. 1932-1934--}} 
     *Date : <input type="text" name="date" value="" required> 
     <BR> 
     *Medium: <input type="text" name="medium" value="" required> 
     <BR> 
     <div> 
      Dimensions: 
      <blockquote> 
       <input type="number" name="length" form="AddObj"> X <input type="number" name="width" form="AddObj"> X <input type="number" name="height" form="AddObj"> 
      </blockquote> 
     </div> 
     Marks: <input type="text" name="marks" value=""> 
     <div> Description 
       <BR> 
       <textarea name="description" form="AddObj" cols='50' style="resize:none; font-size:16px;"></textarea> 
     </div> 
     <br> 
     <div> 
      Image Upload 
      <BR> 
      <input type="file" name="pic" accept="image/*" form="AddObj" required> 
     </div> 
     <br> 
     <input type="submit" value="Submit" form="AddObj"> 
    </form> 

</3> 
    <p> 
     <a href="/">Go Back to Research Center's Home Page </a href> 
    </p> 

下面是相关输出
Console output
- 蒙戈控制台输出:

使用BKMuseum
切换到DB BKMuseum
分贝。 BKMuseum.count()
db.BKMuseum.find({})

回答

0

添加第二个参数是你的集合名称

var MuseumObject = new mongoose.Schema({ 
     accessionNum: String, 
     maker: {String, default: ''}, 
     manufacturer: {String, default: ''}, 
     title: String, 
     date: {String, default: ''}, 
     medium: {String, default: ''}, 
     dimensions: {String, default: ''}, 
     marks: {String, default: ''}, 
     description: {String, default: ''}, 
     pic: {String, default: ''} 
    }, 
    {collection:"your_collection_name"}); 
+0

我想一旦他注册另一个文件中的模型。他可以通过'var museumObj = mongoose.model('MuseumObject')来访问它;',对吧? – Tolsee

+0

@Tolsee是的,但是他在app.js中创建模态时没有使用该模型。他在Db.js中创建了模型,但没有导出它。因此,无论是导出该模型还是在app.js中创建新模型作为模态对象有不同的范围和refarance –

+0

我不认为是这样,他已经注册了一个模型,我认为这是从猫鼬访问,如果你想使用一个单一的连接。 – Tolsee

相关问题