Это из-за отсутствия Python3.dll
(stub dll, который реэкспортирует функции Python3x.dll
, так что одна версия расширения может работать для нескольких версий python).
Если ваш дистрибутив Python не связывает python3.dll, вы можете попробовать один из WinPython ( https://winpython.github.io/ ).
Как минимум версии 2017/04/01 должен иметь его.
1) Загрузить WinPython (достаточно «нулевой» версии; должна быть такая же «основная версия» - 3.5 / 3.6 - и «bitness» - 32/64 - как ваш Python !!!) .
2) Извлеките в некоторый каталог temp, возьмите файл python3.dll и вставьте его в свой каталог python рядом с python3x.dll.
3) Наслаждайтесь работой QT
Метод Mongoose findById
применяет параметр id
к типу поля _id
модели, чтобы он мог правильно запросить соответствующий документ. Это объект ObjectId, но "foo"
не является допустимым ObjectId, поэтому сбой выполняется.
Это не происходит с 41224d776a326fb40f000001
, потому что эта строка является допустимым ObjectId.
One способ разрешить это - добавить проверку перед вызовом findById
, чтобы узнать, является ли id
допустимым ObjectId или нет:
if (id.match(/^[0-9a-fA-F]{24}$/)) {
// Yes, it's a valid ObjectId, proceed with `findById` call.
}
Я пошел с адаптацией решения @gustavohenke, внедряя cast ObjectId в try-catch, обернутый вокруг исходного кода, чтобы использовать отказ в методе ObjectId в качестве метода проверки.
Controller.prototype.show = function(id, res) {
try {
var _id = mongoose.Types.ObjectId.fromString(id);
// the original code stays the same, with _id instead of id:
this.model.findById(_id, function(err, doc) {
if (err) {
throw err;
}
if (!doc) {
res.send(404);
}
return res.send(doc);
});
} catch (err) {
res.json(404, err);
}
};
ИЛИ вы можете сделать это
var ObjectId = require('mongoose').Types.ObjectId;
var objId = new ObjectId( (param.length < 12) ? "123456789012" : param );
, как указано здесь Метод поиска Mongoose с условием $ или не работает должным образом
Вы разбираете эту строку как ObjectId
?
Здесь, в моем приложении, я делаю:
ObjectId.fromString( myObjectIdString );
У меня такая же проблема, я добавляю _id: String .in schema, тогда он начинает работу
Всегда используйте mongoose.Types.ObjectId('your id')
, чтобы условия в вашем запросе проверяли поле id перед запуском вашего запроса, в результате ваше приложение не выйдет из строя.
Я столкнулся с этой проблемой, потому что я объявлял маршрутизатор как
router.put('/:id', async (req, res) => {
// code ....
}
и обновлял данные с помощью url, т. е.
http://localhost:3000/id=5af584ebb62aae2fa8e406a2
Проведя долгое время, я исправляю себя удалив id=
в качестве
, правильный путь:
http://localhost:3000/5af584ebb62aae2fa8e406a2
Теперь я могу использовать findById()
как
let myModel = await Model.findById(req.params.id);
Использовать существующие функции для проверки ObjectID.
var mongoose = require('mongoose');
mongoose.Types.ObjectId.isValid('your id here');
'your id here'
. github.com/mongodb/js-bson/issues/106
– JohnnyHK
8 February 2015 в 16:31
if(mongoose.Types.ObjectId.isValid(userId.id)) {
User.findById(userId.id,function (err, doc) {
if(err) {
reject(err);
} else if(doc) {
resolve({success:true,data:doc});
} else {
reject({success:false,data:"no data exist for this id"})
}
});
} else {
reject({success:"false",data:"Please provide correct id"});
}
лучше всего проверить правильность
Это старый вопрос, но вы также можете использовать пакет express-validator для проверки параметров запроса
express-validator версии 4 (последняя):
validator = require('express-validator/check');
app.get('/show/:id', [
validator.param('id').isMongoId().trim()
], function(req, res) {
// validation result
var errors = validator.validationResult(req);
// check if there are errors
if ( !errors.isEmpty() ) {
return res.send('404');
}
// else
model.findById(req.params.id, function(err, doc) {
return res.send(doc);
});
});
express-validator версия 3:
var expressValidator = require('express-validator');
app.use(expressValidator(middlewareOptions));
app.get('/show/:id', function(req, res, next) {
req.checkParams('id').isMongoId();
// validation result
req.getValidationResult().then(function(result) {
// check if there are errors
if ( !result.isEmpty() ) {
return res.send('404');
}
// else
model.findById(req.params.id, function(err, doc) {
return res.send(doc);
});
});
});
Вы также можете использовать ObjectId.isValid, как показано ниже:
if (!ObjectId.isValid(userId)) return Error({ status: 422 })
_id
, например «bla» ?? Ваш код не сработает ... – gremo 18 February 2013 в 19:45_id
в вашей схеме Mongoose. В случае"bla"
вы использовали бы типString
вместо значения по умолчаниюObjectId
, и вам не нужно было бы добавлять эту проверку, поскольку все может быть передано в строку. – JohnnyHK 18 February 2013 в 19:50ObjectId
из заданной строки (из запросаGET
) для передачи его методуfindById
? – gremo 18 February 2013 в 19:58