nodejs中通过mongoose块对数据库查询到的内容怎么res到前台?
发布于 8 年前 作者 FantasyGao 6368 次浏览 来自 问答

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返回出去 返回到前台

14 回复

这就是个异步变同步的典型例子。把res.write(data)放到return docs这里,并改写为res.write(docs)试试~建议好好学习下nodejs异步编程; 另外呢由于save是异步的,你未必能得到数据~

在save()的回调中通过res对象向前端传要传的数据.

@DevinXian 修改了之后还是不能传到前台数据呢 //查找所有数据 Tag.find(function(err,docs){ if(err) return console.error(err); console.log(docs); res.write(docs); return docs; }); 错误提示是在下面,麻烦你在帮看看 1.png

@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 解决了 非常感谢 作为一个新手理解了很多,真是非常谢谢

回到顶部