无法显示从服务器发送的当前数据

时间:2017-01-23 07:40:16

标签: node.js mongodb mongoose

我使用nodejs作为服务器,我将参数发送到mongodb并将其保存在数据库中,之后我从数据库中获取它。但是当我尝试获取数据时,我无法在nodejs终端中看到当前数据,但它将出现在数据库中。再次,如果我发送其他数据,我将能够看到以前的数据,但不能看到我现在发送的当前数据。我认为我的服务器在保存功能之前调用了find功能。我该怎么做才能让我的保存功能完成它的任务,然后它应该调用查找功能。

这个mongodb代码     从'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);
});

2 个答案:

答案 0 :(得分:0)

mongo方法是异步的,因此只要数据准备好,数据就会写入。使用回调函数promiseasync/await等待结果,而不会阻止事件循环并控制执行顺序。

答案 1 :(得分:0)

我没有运行你的代码,但我想它会归结为这两行:

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

这两个语句都调用异步功能。也就是说,当您调用createStudent("a9", 112);时,该功能将在后台异步运行,Node将继续立即调用listStudent();。因此,在createStudent函数运行时,您的listStudent方法可能尚未将数据写入数据库。

要解决此问题,您需要使用回调函数来仅在实际保存数据后检索数据。例如,您可以执行以下操作:

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使用的核心。