gpt4 book ai didi

node.js - 如何加入同步和异步世界?

转载 作者:太空宇宙 更新时间:2023-11-03 22:00:24 26 4
gpt4 key购买 nike

我从 NodeJs 开始,遇到了一个问题,我相信很多人可能已经解决了。

我有一个基本的 NodeJs Web 服务器,如果找到文件或 404,它会提供文件服务:

var http = require('http'),
url = require('url'),
fs = require('fs'),
mongoose = require('mongoose'),
fileSystem = require('fs'),
path = require('path'),
util = require('util'),
EventEmitter = require('events').EventEmitter;
var mimeTypes = {
"html": "text/html",
"jpeg": "image/jpeg",
"jpg": "image/jpeg",
"png": "image/png",
"js": "text/javascript",
"css": "text/css"};
var server;
var Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/test');
var db = mongoose.connection;

var personneSchema = new Schema({
nom: String,
prenom: String
});
var Personne = db.model('Personne', personneSchema);

var personneAdresseSchema = new Schema({
idPersonne: String,
idAdresse: String
});
var PersonneAdresse = db.model('PersonneAdresse', personneAdresseSchema);

var adresseSchema = new Schema({
ligne1: String,
ligne2: String,
codePostal: String,
ville: String
});
var Adresse = db.model('Adresse', adresseSchema);
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function () {
server = http.createServer(function (request, response) {
if (request.url=='/persons') {
console.log('> Persons request');
/* IMPLEMENTATION PROBLEM HERE */
var retour='[]';
retour=retour.substr(0, retour.length-1)+']';
response.writeHead(200, {
'Cache-Control': 'no-cache, must-revalidate',
'Expires': 'Mon, 26 Jul 1997 05:00:00 GMT',
'Content-type': 'application/json'
});
response.end(retour);
console.log('> end of main function');
return;
}
var uri = url.parse(request.url).pathname;
var filename = path.join(process.cwd(), uri);
console.log("> " + filename);
fs.exists(filename, function(exists) {
if ((!exists) || (fs.lstatSync(filename).isDirectory())) {
console.log(">> fichier inexistant : " + filename);
response.writeHead(200, {'Content-Type': 'text/plain'});
response.write('404 Not Found\n');
response.end();
// Stopper tout traitement :
return;
}
var mimeType = mimeTypes[path.extname(filename).split(".")[1]];
response.writeHead(200, {'Content-Type':mimeType});

var fileStream = fs.createReadStream(filename);
fileStream.pipe(response);
});
});
// Listen on port 8000, IP defaults to 127.0.0.1
server.listen(8000);
// Put a friendly message on the terminal
console.log("Server running at http://127.0.0.1:8000/");
});

问题是:网络服务器需要在“main”函数结束之前获取准备发送的响应。但如果你尝试进行 Mongoose 调用,它不是同步的。如果你把下面的代码放在main函数中:

Personne.find({}).select('nom prenom').exec(function (err, p) {
console.log('> Persons request finished');
});

日志显示如下:

> Persons request
> end of main function
> Persons request finished

因此需要填充“response”的主函数不能用 Personne.find({}) 填充,因为 Personne.find({})之后完成。有什么方法可以处理这个问题呢?我在 Web 上找不到一个非常简单、 self 解释的示例(nodejs + mongoose 总是为我提供单独使用 Nodejs、单独使用 mongoose 或使用完整 Web 框架的解决方案,而我只需要一个简单的工作示例)。

最佳答案

您想要在数据库调用完成后执行的任何代码都必须位于数据库调用的回调函数中。因此,您不能只将数据库调用放在主函数中 - 您必须将数据库调用后需要执行的主函数中的所有代码移至回调函数中。

关于node.js - 如何加入同步和异步世界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27896661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com