从mongoose db获取模型

时间:2013-12-19 11:00:42

标签: node.js mongodb express mongoose

我目前正在研究构建一个基于REST的小型服务,我可以将POST一些数据GET转换为mongoose db并将var http = require("http"); var DAO = require("./DAO"); var express = require("express"); var util = require('util'); var app = express(); app.use(express.bodyParser()); app.post('/postIsles',function(req,res){ DAO[req.method](req.body); res.send("body" + req.body.name); }); app.get('/getIsles',function(req,res){ var isleVar = DAO[req.method](req); res.send(isleVar); }); app.listen("3000"); console.log("\nApp available at http://127.0.0.1:3000\n"); 数据反馈回来。

这是我的main.js文件:

var mongoose = require('mongoose');

//Connect to database
mongoose.connect( 'mongodb://127.0.0.1:27017/library_database' );

//Schemas
var Isle = new mongoose.Schema({
    name: String,
    description: String,
    lastStocked: Date
});

//Models
var IsleModel = mongoose.model( 'Isle', Isle );

function POST(request) {
    var name = request.name;
    var description = request.description;
    var lastStocked = request.lastStocked;

    console.log("POST REQ +" + request);
    var isle = new IsleModel({
    name: name,
    description: description,
    lastStocked: lastStocked
    });

    isle.save( function( err ) {
        if( !err ) {
            return console.log( 'created' );
        } else {
            return console.log( err );
        }
    });
}

function GET(request) {
    return IsleModel.find( function( err, islesT ) {
        if( !err ) {
            console.log("isles :"+islesT);
            return islesT;
        } else {
            return console.log( err );
        }
    });
}

exports.POST = POST;
exports.GET = GET;

和DAO.js:

GET

当我尝试运行TypeError: Converting circular structure to JSON at Object.stringify (native) 时,出现以下错误:

{{1}}

我有点不确定如何克服这个问题。

1 个答案:

答案 0 :(得分:1)

请记住使用Node.js时:涉及IO的任何操作都将是异步的。

Model#find是一种异步方法,因此isleVar未设置为您期望的结果。您的结果只能在传递给IsleModel.find

的匿名函数中使用

要修复您的GET方法,您需要修改代码以考虑数据库请求的异步性,并且只有在您的应用有机会检索数据后才会发送响应。

下面是修复/getIsles的一种可能解决方案的示例:

在main.js中,修改你的get路由以传入res(所以它可以异步处理)

app.get('/getIsles',function(req,res){
        return DAO[req.method](req, res);
});

在DAO.js中,让响应将回调内的数据发送到IsleModel.find

function GET(request, response) {
   IsleModel.find( function( err, islesT ) {
        if( !err ) {
            console.log("isles :"+islesT);
            response.send(islesT);
        } else {
            return console.log( err );
        }
    });
}