在我的html中使用节点函数

时间:2016-04-18 12:46:45

标签: javascript html node.js mongodb mongoose

我正在创建一个网站,当点击按钮时需要更改嵌入的视频。我的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);
}

谢谢你的帮助!

1 个答案:

答案 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>