Express.js 使用回调的执行流程
Express.js execution flow using callbacks
我对 express.js 应用程序的执行流程有很大的疑问,其中有对数据库的异步请求。
我已经阅读了 Node.js 架构并且我知道当我执行阻塞请求(如数据库请求)时,请求是在一个线程上执行的,当请求得到满足时,添加工作(回调的代码为阻塞请求指定的函数)在事件队列中。
现在...因为我使用 mongoDb 作为应用程序数据库并且由于 mongodb 没有提供执行同步请求的方法,我怎么能确保在请求之前不执行对客户端的响应查询已完成?
例如,在这种情况下,我有一个请求处理程序(不是中间件):
app.all("/",function(req,res){
db.find({},function(err,doc){
//Retreive certain informations from the db needed by the client
});
});
app.all("/",function(req,res){
res.status(200).end();
});
这是使用 express.js 和 mongodb...
的常见示例
但是执行流程实际上是如何进行的?
对于中间件,我没有这个疑问,因为执行流程会停止,直到调用 next() 方法(您可以在数据库回调中调用它)。
提前致谢,
卢卡·M.
在您发回内容之前,请求将一直有效。只需在数据库查询回调中响应,如下所示:
app.all("/",function(req,res){
db.find({},function(err,doc){
if(err) {
//handle error
console.error('oops', err);
res.send(500);
} else {
res.json(200, doc);
}
});
});
在这种情况下,定义路由的顺序很重要。在 app.all
中,您实际上可以指定 next()
函数来顺序执行这些调用。
既然你提到了next()
,这里有一个如何链接中间件的基本示例:
function findInDb(id, callback){
db.get(id, function(err, data){
if(err){ return callback(err) };
var obj = JSON.parse(data)[0] // or something
callback(null, obj)
});
};
app.all('*', function(req, res, next){
findInDb('something', function(err, obj){
if(err){ return next(err) };
res.myObj = obj;
next();
});
});
app.get('/', function(req, res){
// By now the first middleware executed
res.status(200).json(res.myObject);
});
我对 express.js 应用程序的执行流程有很大的疑问,其中有对数据库的异步请求。 我已经阅读了 Node.js 架构并且我知道当我执行阻塞请求(如数据库请求)时,请求是在一个线程上执行的,当请求得到满足时,添加工作(回调的代码为阻塞请求指定的函数)在事件队列中。 现在...因为我使用 mongoDb 作为应用程序数据库并且由于 mongodb 没有提供执行同步请求的方法,我怎么能确保在请求之前不执行对客户端的响应查询已完成?
例如,在这种情况下,我有一个请求处理程序(不是中间件):
app.all("/",function(req,res){
db.find({},function(err,doc){
//Retreive certain informations from the db needed by the client
});
});
app.all("/",function(req,res){
res.status(200).end();
});
这是使用 express.js 和 mongodb...
的常见示例但是执行流程实际上是如何进行的?
对于中间件,我没有这个疑问,因为执行流程会停止,直到调用 next() 方法(您可以在数据库回调中调用它)。
提前致谢,
卢卡·M.
在您发回内容之前,请求将一直有效。只需在数据库查询回调中响应,如下所示:
app.all("/",function(req,res){
db.find({},function(err,doc){
if(err) {
//handle error
console.error('oops', err);
res.send(500);
} else {
res.json(200, doc);
}
});
});
在这种情况下,定义路由的顺序很重要。在 app.all
中,您实际上可以指定 next()
函数来顺序执行这些调用。
既然你提到了next()
,这里有一个如何链接中间件的基本示例:
function findInDb(id, callback){
db.get(id, function(err, data){
if(err){ return callback(err) };
var obj = JSON.parse(data)[0] // or something
callback(null, obj)
});
};
app.all('*', function(req, res, next){
findInDb('something', function(err, obj){
if(err){ return next(err) };
res.myObj = obj;
next();
});
});
app.get('/', function(req, res){
// By now the first middleware executed
res.status(200).json(res.myObject);
});