从mongoose数据库获取模型
我目前正在考虑build立一个小的基于REST的服务,我可以将一些数据发布到一个mongoose数据库并GET
数据。
这是我的main.js文件:
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");
和DAO.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;
当我尝试运行GET
,出现以下错误:
TypeError: Converting circular structure to JSON at Object.stringify (native)
我有点不确定如何克服这一点。
请记住使用Node.js时:任何涉及IO的操作都将是asynchronous的。
Model#find是一个asynchronous方法,所以isleVar
没有设置为你所期望的结果。 你的结果只能在你传递给IsleModel.find的匿名函数中使用
要修复您的GET方法,您需要修改代码以考虑数据库请求的asynchronous性,只有在应用程序有机会检索数据时才发送响应。
下面是修复/getIsles
的一个可能的解决scheme的例子:
在main.js中,修改你的get路由来传递res(所以可以asynchronous处理)
app.get('/getIsles',function(req,res){ return DAO[req.method](req, res); });
在DAO.js中,有回应将你的callback内的数据发送给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 ); } }); }