var http=require(‘http’); http.createServer(function(req,res){ res.writeHead(200, { ‘Content-Type’: ‘text/plain’,‘Access-Control-Allow-Origin’:‘http://localhost’}); console.log('Request received: '); var mongoose=require(‘mongoose’); mongoose.connect(‘mongodb://127.0.0.1:27017/tes’);
var db=mongoose.connection;
var data='';
db.on('error',console.error.bind(console,'连接失败'));
db.once('open',function(res,callback){
var Schema=mongoose.Schema({
title:String,
connect:String,
time : {type:Date, default: Date.now}
});
var Tag=mongoose.model('Tag',Schema);
var blogtext =new Tag({
title:'第一篇',
connect:'第一篇内容'
});
blogtext.save(function(err){
if(err)
return console.error(err);
});
//查找所有数据
Tag.find(function(err,docs){
if(err)
return console.error(err);
console.log(docs);
return docs;
});
}); res.write(data); res.end(); }).listen(8090,‘127.0.0.1’);
遇到的问题:如何把查询到的docs数据传给data呢,让其返回到前台,谢谢各位了
如何把** //查找所有数据 Tag.find(function(err,docs){ if(err) return console.error(err); console.log(docs); return docs; });** 里面的docs返回出去 返回到前台
这就是个异步变同步的典型例子。把res.write(data)
放到return docs
这里,并改写为res.write(docs)
试试~建议好好学习下nodejs异步编程;
另外呢由于save
是异步的,你未必能得到数据~
@DevinXian 修改了之后还是不能传到前台数据呢 //查找所有数据 Tag.find(function(err,docs){ if(err) return console.error(err); console.log(docs); res.write(docs); return docs; }); 错误提示是在下面,麻烦你在帮看看
@yinxin630 能具体一下吗 我小白一名 谢谢了
直接return res.json(data)不就可以了吗 From Noder
@zhangzeyang 获取不到data数据好像 我试了下
你要把
res.write(docs);
res.edn()
一起放到find操作的回调里面
类似这样:
var http = require('http');
var mongoose = require('mongoose');
http.createServer(function (req, res) {
res.writeHead(200, {'Content - Type’: ‘text / plain’,‘Access - Control - Allow - Origin’:‘http://localhost'});
console.log('Request received: ');
mongoose.connect('mongodb://127.0.0.1:27017/tes');
var db = mongoose.connection;
var data = '';
db.on('error', console.error.bind(console, '连接失败'));
db.once('open', function (res, callback) {
var Schema = mongoose.Schema({
title: String,
connect: String,
time: {type: Date, default: Date.now}
});
var Tag = mongoose.model('Tag', Schema);
var blogtext = new Tag({
title: '第一篇',
connect: '第一篇内容'
});
blogtext.save(function (err) {
if (err)
return console.error(err);
});
//查找所有数据
Tag.find(function (err, docs) {
if (err)
return console.error(err);
console.log(docs);
res.write(data);
res.end();
});
});
}).listen(8090, '127.0.0.1');
原因就是Tag.find是一个异步操作,程序执行到这里不会等待find函数的回调,直接走到下面的res.write()和res.end()函数了,那么你仅仅把res.write移到find的回调里面,就会出现先res.end(),再出发find的回调函数,此时socket已经被res.end()关闭了,所以res变成了undefined,那么你调用res.write就会提示你上面的错误了; 顺便感觉你的代码写的挺乱的,模块require引入最好置顶吧~
推荐 express + mongoose 去做nodejs web. 你这所有的逻辑都写道一块,看着实在是别扭
@hyj1991 我懂你说的 但是改成这样还是那个问题~麻烦在帮看一下 谢谢了 //查找所有数据 Tag.find(function(err,docs){ if(err) return console.error(err); console.log(docs); res.write(docs); res.end(); }); TypeError: Cannot read property ‘write’ of undefined at C:\Users\gao\Desktop\one_blog\montoo.js:31:7 at Query.<anonymous> (C:\Users\gao\node_modules\mongoose\lib\model.js:3352:16) at C:\Users\gao\node_modules\kareem\index.js:244:21 at C:\Users\gao\node_modules\kareem\index.js:127:16 at _combinedTickCallback (internal/process/next_tick.js:67:7) at process._tickCallback (internal/process/next_tick.js:98:9)
@NextZeus 那个用过了 感觉那个很好用 也很强大 我只是想把它里面的一部分摘出来做一个很简单的 交互
@FantasyGao 把你的这部分代码
// 这边的res改成别的形参名字
db.once('open', function (res, callback) {
var Schema = mongoose.Schema({
title: String,
connect: String,
time: {type: Date, default: Date.now}
});
var Tag = mongoose.model('Tag', Schema);
var blogtext = new Tag({
title: '第一篇',
connect: '第一篇内容'
});
blogtext.save(function (err) {
if (err)
return console.error(err);
});
//查找所有数据
Tag.find(function (err, docs) {
if (err)
return console.error(err);
console.log(docs);
res.write(data);
res.end();
});
});
db.once(‘open’, function (res, callback) {})一段里面的res改成别的形参名字哇,由于函数作用域的问题,你在这里面的res.write会变成这里的res,肯定不对
@hyj1991 解决了 非常感谢 作为一个新手理解了很多,真是非常谢谢