Javascript NodeJS异步数据库获取服务器冻结
我有一个应用程序在NodeJS上运行(express+mongoose+jade)。 我有一个post路由/搜索(所有路由都在一个单独的模块中),它应该处理从mongo数据库获取数据并将其插入jade模板(在本例中,只需打印控制台): 在不同模块数据交换器中实现的搜索和获取功能: 问题是当我使用getArray()的回调函数时,服务器在返回文档时会冻结并停止响应。 我做错了什么Javascript NodeJS异步数据库获取服务器冻结,javascript,node.js,express,asynchronous,Javascript,Node.js,Express,Asynchronous,我有一个应用程序在NodeJS上运行(express+mongoose+jade)。 我有一个post路由/搜索(所有路由都在一个单独的模块中),它应该处理从mongo数据库获取数据并将其插入jade模板(在本例中,只需打印控制台): 在不同模块数据交换器中实现的搜索和获取功能: 问题是当我使用getArray()的回调函数时,服务器在返回文档时会冻结并停止响应。 我做错了什么 router.post('/search', function (req,res) { va
router.post('/search', function (req,res) {
var componentsArray = null;
function getArray(cb){
console.log('Initializing...');
componentsArray = dataExchanger.search(req.body.select, req.body.selectType, req.body.searchField);
//Execute the callback
cb();
}
getArray(function () {
console.log('Documents returned.');
console.log('Printing array...');
console.log('Array: ' + componentsArray);
console.log('Array type: ' + typeof (componentsArray));
console.log('Rendering page...');
res.render('search_results');
});
});
看起来您的搜索方法也是异步的,因此您需要将回调向下传递到该方法以获得所需的结果。尝试使用async/await
router.post('/search', async (req,res) => {
let componentsArray;
try {
componentsArray = await dataExchanger.search(req.body.select, req.body.selectType, req.body.searchField);
} catch(e){
//If error in request and no data.
console.error('Error', e.message);
return res.render('error_message');
}
console.log('Documents returned.');
console.log('Printing array...');
console.log('Array: ' + componentsArray);
console.log('Array type: ' + typeof (componentsArray));
console.log('Rendering page...');
res.render('search_results');
});
这是您的数据交换机
exports.search = function(select, type, data) {
console.log('Fetching documents...');
return new Promise((resolve, reject) => {
componentsModel.find({name: data}, function (err, docs) {
if(err) return reject(err);
resolve(docs);
});
})
};
进一步阅读:,您在哪里执行传递给getArray的回调?我正在传递匿名函数给它。抱歉,对于异步函数来说是新的。读了一些文章后仍然无法理解。您正在传递它,但没有执行它。执行应该是什么样子?像getArray(callback)和callback()?这样做。现在的问题是回调并不等待返回数组。所以现在在文档返回之前调用它。谢谢!就这样!我们将深入探讨。由于Express不处理承诺,因此最好使用try…catch…finally包装所有内容,否则可能会导致未处理的请求而没有错误(最好是未处理的承诺错误)。
router.post('/search', async (req,res) => {
let componentsArray;
try {
componentsArray = await dataExchanger.search(req.body.select, req.body.selectType, req.body.searchField);
} catch(e){
//If error in request and no data.
console.error('Error', e.message);
return res.render('error_message');
}
console.log('Documents returned.');
console.log('Printing array...');
console.log('Array: ' + componentsArray);
console.log('Array type: ' + typeof (componentsArray));
console.log('Rendering page...');
res.render('search_results');
});
exports.search = function(select, type, data) {
console.log('Fetching documents...');
return new Promise((resolve, reject) => {
componentsModel.find({name: data}, function (err, docs) {
if(err) return reject(err);
resolve(docs);
});
})
};