2016-04-16 24 views
0

私はユーザーが自分の写真をアップロードできるMEANアプリケーションを持っています。Node.js/mongoose:未定義は関数ではありません

var express = require('express'); 
var router = express.Router(); 
var passport = require('passport'); 
var User = require('../models/user'); 
var Verify = require('./verify'); 
var multiPart = require('connect-multiparty'); 
var multiPartMiddleWare = new multiPart(); 
var fs = require('fs-extra'); 
var path = require('path'); 

    router.post('/edit', multiPartMiddleWare ,function(req, res) { 
    var file = req.files.file; 
    theuser = req.body.username; 
    console.log("User " + theuser + "..." + file); 

    var uploadDate = new Date(); 
    console.log(file.path + '\n') 
    var tempPath = file.path; 
    var finalPath = path.join(__dirname, "../userphotos/", theuser + file.name); 
    console.log(finalPath); 
    var savePath = "/userphotos/" + theuser + uploadDate + file.name; 

    fs.rename(tempPath, finalPath, function (err){ 
     if (err){ 
      console.log(err) 
     } else { 
      User.find({"username":theuser}, function(err, userData){ 
       var userd = userData; 
       userd.image = savePath; 
       console.log('\n' + userd + '\n'); // the userd is proper 
       userd.save(function(err){ //Error occurs HERE 
        if (err){ 
         console.log("Error whilst saving file: " + err) 
         res.json({status: 500}) 
        } else { 
         console.log("Image saved"); 

         res.json({status: 200}) 
        } 
        }) 
       }) 
      } 
     }) 
}); 

画像は、一時フォルダと宛先に保存されます。ただし、ソースをユーザー文書に保存しようとすると、undefined is not a functionが表示されます。ここで

は私のマングースのルートです:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var passportLocalMongoose = require('passport-local-mongoose'); 

var User = new Schema({ 
    username: { 
     type: String, 
     unique: true 
    }, 
    password: String, 
    image: { 
     type: String 
    }, 
    bio: { 
     type: String 
    } 
}); 

User.plugin(passportLocalMongoose); 

module.exports = mongoose.model('User', User); 

どのように私はこの問題を解決するのですか?

答えて

1

私はあなたがここで間違った機能を使用していると思う:

User.find({"username":theuser}, function(err, userData){ ... 

あなたはそれが配列を返すUser.find()を使用して、したがって、あなたがすることはできませんsave

User.findOne({"username":theuser}, function(err, userData){ ... 
1

を試してみてください。 userData[0]を使用して配列から最初のUserを取得するか、User.findOne()を使用すると、最初に一致するUserが返されます。

0

var userd = userData;var userd = userData[0];に変更してください。 userDataは複数のドキュメントの配列を持っています(配列内に1つのdocだけを含むかもしれません)ので、変更を行うために1つのドキュメントを取得する必要があります。

関連する問題