Существует более простой способ:
virtualenv venv --python=python2.7
. Благодаря комментарию это работает только если у вас установлен python2.7 на системном уровне (например, /usr/bin/python2.7).
В противном случае, если вы используете доморощенный, вы можете использовать путь, чтобы дать вам то, что вы хотите.
virtualenv venv --python=/usr/local/bin/python
Вы можете найти путь к вашей установке python с помощью
which python
Это также будет работать с python 3.
which python3
>> /usr/local/bin/python3
virtualenv venv --python=/usr/local/bin/python3
В конечном итоге сжимается до:
virtualenv venv -p `which python`
virtualenv venv -p `which python3`
Вы должны убедиться, что оператор await завершен, прежде чем вы сможете сравнить. Помните, что async / await не заставляет код работать синхронно, он просто форматирует его таким образом, чтобы мы, разработчики, выглядели так, как будто он синхронизирован.
function findData() {
return Tarrif.find().distinct('tarrif_type',(err,docs)=>{
docs.forEach(async (ele)=>{
let count= User.countDocuments({tarrif_type:ele});
result.push(ele);
resu[ele]=await count;
result.push(count);
});
});
};
router.get('/getTarrifDetails',async (req,res,next)=>{
let res = null;
try {
res = await findData();
} catch(e) {
console.log(e);
}
if(res !== 0){
//do something
} else {
// do something else
}
});
Ваш код неверен.
1) Не рекомендуется хранить контекстную переменную resu
вне области запроса.
2) result.push
? где переменная result
? снова вне зоны видимости?
3) resu.length
? это не массив, это объект, поэтому вы не получите результат false
или 0
.
4) find().distinct('tarrif_type', (err,docs) => ...
Мангуст поддерживает обещания, так почему Вы использовали его с обратным вызовом?
5) await resu.length
? это не обещание, это просто объект, а длина - это свойство. Вы не можете спросить await
из атрибута не-обещания
6) getAll
, что если resu.length
действительно будет иметь 0
? на что это ответит? - поэтому запрос будет зависать, поэтому Вы должны ответить на все вопросы, чтобы изящно закрыть соединение, созданное во время запроса.
Таким образом, общее исправление должно работать:
router.get('/getTarrifDetails', async (req, res) => {
try {
const tarrifTypes = await Tarrif.find().distinct('tarrif_type');
const tarrifCounters = {};
let total = 0;
for(const tarrifType of tarrifTypes) {
const count = await User.count({tarrif_type: tarrifType});
tarrifCounters[tarrifType] = count;
total+= count;
}
res.status(200).send({
tarrifTypes,
tarrifCounters,
total
});
} catch(error) {
res.status(500).send(error.message);
}
});
или с использованием параллелизма:
const getTarrifUsersCounters = async (tarrifTypes) => {
// initial result
const result = {
tarrifTypes,
tarrifCounters: {},
total: 0
};
// if no tarriffTypes passed return result
if (!(Array.isArray(tarrifTypes) && tarrifTypes.length > 0)) {
return result;
}
// generating array of promises from tarrifTypes
const callStack = [];
for(const tarrifType of tarrifTypes) {
callStack.push(
new Promise(async resolve => {
const count = await User.count({tarrif_type: tarrifType});
resolve({tarrifType, count});
});
);
}
// calling promises array in parallel
if (callStack.length) {
(await Promise.all(callStack))
.forEach(
({tarrifType, count}) => {
result.tarrifCounters[tarrifType] = count;
result.total += count;
});
}
return result;
};
router.get('/getTarrifDetails', async (req, res) => {
try {
const tarrifTypes = await Tarrif.find().distinct('tarrif_type');
const result = await getTarrifUsersCounters(tarrifTypes);
res.status(200).send(result);
}
catch(error) {
res.status(500).send(error.message);
}
});