我使用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);
});
答案 0 :(得分:0)
mongo方法是异步的,因此只要数据准备好,数据就会写入。使用回调函数promise或async/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使用的核心。