2017-01-23 11 views
0

私はサーバとしてnodejsを使用しています。データベースからフェッチした後、mongodbにパラメータを送信してデータベースに保存しています。しかし、私がデータを取得しようとすると、私はnodejs端末の現在のデータを見ることができませんが、データベースに存在します。もう一度他のデータを送信すれば、私は以前のデータを見ることができますが、今送られてきた現在のデータは見ることができません。私のサーバーはsave関数の前にfind関数を呼び出していると思います。どのような作業を完了するために私の保存関数を作成する必要がありますし、それはfind関数を呼び出す必要があります。サーバから送信された現在のデータを表示できません

このmongodbコード 'mongoose'からのインポートmongoose;

var Schema = mongoose.Schema; 
//connect to a MongoDB database 
var db = mongoose.connect('mongodb://127.0.0.1:27017/student'); 

mongoose.connect('connected', function() { 
    console.log("database connected successfully") 
}); 


var userSchema = new Schema({ 
    Name: { 
     type: String, 
     required: true 
    }, 
    Age: { 
     type: Number, 
     required: true 
    } 
}, { 
    collection: ('studentcollection2') 
}); 

var User = mongoose.model('User', userSchema); 

function createStudent(name, age) { 
    var list = new User({ 
     Name: name, 
     Age: age 
    }); 
list.save(function(err) { 
    if (err) throw err; 

    console.log("SUCCESSFUL"); 
}); 
} 

function listStudent() { 
    User.find({}, function(err, studentcollection2) { 
     if (err) throw err; 
     console.log(studentcollection2); 
    }); 
} 


exports.createStudent = createStudent; //module.exports = User; 
exports.listStudent = listStudent; 

これは私のサーバーコード

import config from './config'; 
import express from 'express'; 
const server = express(); 

import mongodbInterface from './mongodbInterface'; 
server.set('view engine', 'ejs'); 
server.get('/', (req, res) => { 
    res.render('index', { 
     content: '...' 
    }) 
}); 
console.log(typeof mongodbInterface.createStudent); 

mongodbInterface.createStudent("a9", 112); 
mongodbInterface.listStudent(); 


server.use(express.static('public')); 
server.listen(config.port,() => { 
    console.info('express listening on port', config.port); 
}); 

答えて

0

私はあなたのコードを実行していないが、私はこの2行まで来るのを想像:これらのステートメントの両方が非同期機能を呼び出す

mongodbInterface.createStudent("a9", 112); 
mongodbInterface.listStudent(); 

。つまり、createStudent("a9", 112);を呼び出すと、その機能はバックグラウンドで非同期に実行され、NodeはlistStudent();を直ちに呼び出し続けます。したがって、listStudent関数を実行するまでに、createStudentメソッドでデータをデータベースに書き込んでいない可能性があります。

これを解決するには、コールバック関数を使用して、データが実際に保存された後にのみ取得する必要があります。たとえば、次の操作を行うことができます:

function createStudent(name, age, cb) { 
    var list = new User({ 
     Name: name, 
     Age: age 
    }); 

    list.save(function(err) { 
     if (err) return cb(err); 

     return cb(); 
    }); 
} 

function listStudent(cb) { 
    User.find({}, function(err, studentcollection2) { 
     if (err) return cb(err); 

     return cb(null, studentCollection2); 
    }); 
} 

次に、サーバーのコードで:

mongodbInterface.createStudent("a9", 112, function(err) { 
    if (err) throw err; 

    mongodbInterface.listStudent(function(err, students) { 
     console.log(students); // You should see the newly saved student here 
    }); 
}); 

私はNode.jsのコールバックhereについての詳細を読んでお勧めします - 彼らは本当に使い方にコアですNode.jsの

0

Mongoの方法は非同期ですので、それは準備ができたときにデータが書き込まれますです。コールバック関数promiseまたはasync/awaitを使用して、イベントループをブロックしたり、実行順序を制御したりせずに結果を待機します。

関連する問題