我正在创建一个网站,当点击按钮时需要更改嵌入的视频。我的html页面加载了一个js脚本,需要调用数据库中用节点编码的函数。整个事情是在mongoDB服务器上运行,用mongoose支持我。为了使事情更清楚,这里有一些代码:
我的数据库(仅相关功能):
function database(){
db = mongoose.createConnection(url);
songModel = db.model('Song',{id : Number ,
title : String,
artist : String,
genre : String,
rating : Number,
link : String
});
//init freeid
songModel.count({},function(err, c){
nextFreeId=c;
});
};
database.prototype.getNextFreeId = function(){
return nextFreeId;
};
database.prototype.getSongById=function(id2){
songModel.findOne({id : id2}, function(err,obj){
if (err) {
console.log('Not Found, error: '+err);
return null;
} else if (obj) {
console.log('Found:', obj);
return obj;
}
});
};
module.exports = database;
现在我需要通过我的html页面调用脚本,该页面能够调用getSongById(someID)。我应该怎么做才知道我不能要求(数据库),因为require是基于节点和服务器的。此外,因为getSongById(someID)是异步的,因为保存调用我如何确保返回值不为空?我需要超时几秒吗?
脚本文件需要是这样的,html页面加载getRandomVideo():
var db=require('./module/database');
function getRandomVideo(){
console.log('random video method called');
var numberOfSongs = db.getNextFreeId()-1;
idToGet=Math.floor(Math.random() * numberOfSongs);
var song = db.getSongById(idToGet);
document.getElementById('myVideo').src = song.link;
console.log('found random song: '+ song);
}
谢谢你的帮助!
答案 0 :(得分:1)
在节点中创建一个到getSongById()
函数的路由,然后从你的html文件中向该url发出一个ajax请求。
让我们说,在你的app.js中,有类似的东西:
app.get('/random-video', function(req, res) {
console.log('random video method called');
var numberOfSongs = db.getNextFreeId()-1;
idToGet=Math.floor(Math.random() * numberOfSongs);
db.getSongById(idToGet, function(err, song){
console.log('found random song: '+ song);
res.send(JSON.stringify(song));
});
});
您还必须将getSongById()
功能修改为异步,例如:
database.prototype.getSongById=function(id2, cb){
songModel.findOne({id : id2}, function(err,obj){
if (err) {
console.log('Not Found, error: '+err);
cb(err);
} else if (obj) {
console.log('Found:', obj);
cb(null, obj);
}
});
};
然后,在你的html页面中,一旦加载了jQuery,就可以执行以下操作:
<script>
$(document).ready(function(){
$.ajax({
url: '/random-video',
contentType: 'application/json; charset=utf-8',
}).done(function(song){
//do stuff with the song
});
})
</script>