javascript - NodeJS异步数据库获取服务器冻结
问题描述
我有一个在 NodeJS(express + mongoose + jam)上运行的应用程序。我有一个路由后/搜索(所有路由都在一个单独的模块中),它应该处理从 mongo 数据库中获取数据并将其插入到玉模板中(在这种情况下只是打印控制台):
router.post('/search', function (req,res) {
var componentsArray = null;
function getArray(){
console.log('Initializing...');
componentsArray = dataExchanger.search(req.body.select, req.body.selectType, req.body.searchField);
}
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');
});
});
在不同的模块dataExchanger中实现的搜索和获取功能:
exports.search = function(select, type, data) {
console.log('Fetching documents...');
componentsModel.find({name: data}, function (err, docs) {
if(!err) {
console.log('Returning documents...');
return docs;
} else {
console.log('Can\'t return documents!');
throw err;
}
});
};
问题是,当我对getArray()使用回调函数时,服务器在返回文档时会冻结并停止响应。我究竟做错了什么?
解决方案
尝试使用异步/等待
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);
});
})
};
推荐阅读
- powerbi - CALCULATE 中的 FILTER 是否添加或修改过滤器上下文?
- terraform - 用于依赖 argumnets 的单个 terraform 模块
- python - Pythod xlrd 细胞类型
- python - 使用 celery 顺序运行独立任务
- javascript - 我正在尝试使用画布从 php 和 javascript 中的 ip 摄像头获取图像
- php - 三元运算符。&& 不起作用。Laravel,刀片
- android - 以下 kotlin 代码在 java 中的等效代码是什么?
- pytorch - 如何在 PyTorch 中拉伸和挤压图像?
- jpa - 带有 eclipselink 3.0 的 Wildfly 21 出现错误,因为找不到持久性提供程序
- python - 如何从未知数量的字典列表中返回键值字典对?