CastError, когда открытая ссылка на статический файл в Jade, Nodejs [duplicate]

Это из-за отсутствия 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

69
задан gremo 18 February 2013 в 18:18
поделиться

13 ответов

Метод 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.
}
111
ответ дан JohnnyHK 21 August 2018 в 11:01
поделиться
  • 1
    Что делать, если я решил использовать свой пользовательский _id, например «bla» ?? Ваш код не сработает ... – gremo 18 February 2013 в 19:45
  • 2
    @Gremo. Вы можете выбрать только один тип, который будет использоваться для _id в вашей схеме Mongoose. В случае "bla" вы использовали бы тип String вместо значения по умолчанию ObjectId, и вам не нужно было бы добавлять эту проверку, поскольку все может быть передано в строку. – JohnnyHK 18 February 2013 в 19:50
  • 3
    Я понимаю, но я бы хотел избежать этой проверки. Как я могу создать новый ObjectId из заданной строки (из запроса GET) для передачи его методу findById? – gremo 18 February 2013 в 19:58
  • 4
    @Gremo Вы не можете. Вы можете создавать ObjectIds только из 24 шестнадцатеричных символьных строк. – JohnnyHK 18 February 2013 в 20:24
  • 5
    Вы можете просто использовать find ({_ id: yourId}, ...) для запроса документа с этим (уникальным) идентификатором. Это и ответ JohnnyHK на добавление _id в вашу схему (с вашим желаемым типом «строка») - это полное решение вашей проблемы. – Steve Hollasch 3 January 2014 в 23:26

Я пошел с адаптацией решения @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);
  }
};
0
ответ дан charneykaye 21 August 2018 в 11:01
поделиться

ИЛИ вы можете сделать это

var ObjectId = require('mongoose').Types.ObjectId; var objId = new ObjectId( (param.length < 12) ? "123456789012" : param );

, как указано здесь Метод поиска Mongoose с условием $ или не работает должным образом

0
ответ дан Community 21 August 2018 в 11:01
поделиться

Вы разбираете эту строку как ObjectId?

Здесь, в моем приложении, я делаю:

ObjectId.fromString( myObjectIdString );
8
ответ дан gustavohenke 21 August 2018 в 11:01
поделиться
  • 1
    Нужно ли мне? Зачем? _id назначается MongoDB ... – gremo 18 February 2013 в 19:26
  • 2
    Да, вы должны, потому что вы запрашиваете тип ObjectId, так что приведение требуется. – gustavohenke 18 February 2013 в 19:33
  • 3
    mongoose.Schema.Types.ObjectId не имеет метода fromString ... – gremo 18 February 2013 в 19:53
  • 4
    Попробуйте mongoose.Types.ObjectId. – gustavohenke 18 February 2013 в 19:59
  • 5
    Работает, но я получаю & quot; Invalid ObjectId & quot; при передаче "foo". Итак, в чем смысл создания ObjectId из строки, если это может закончиться неудачей? – gremo 18 February 2013 в 20:02

У меня такая же проблема, я добавляю _id: String .in schema, тогда он начинает работу

0
ответ дан s.babar 21 August 2018 в 11:01
поделиться

Всегда используйте mongoose.Types.ObjectId('your id'), чтобы условия в вашем запросе проверяли поле id перед запуском вашего запроса, в результате ваше приложение не выйдет из строя.

0
ответ дан Suman 21 August 2018 в 11:01
поделиться

Я столкнулся с этой проблемой, потому что я объявлял маршрутизатор как

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);
0
ответ дан WasiF 21 August 2018 в 11:01
поделиться

Использовать существующие функции для проверки ObjectID.

var mongoose = require('mongoose');
mongoose.Types.ObjectId.isValid('your id here');
25
ответ дан xpepermint 21 August 2018 в 11:01
поделиться
  • 1
    Осторожно, используя этот метод, поскольку он имеет любопытное поведение при обработке любой 12-байтовой строки как действительной. Поэтому он даже возвращает true для вашего примера 'your id here'. github.com/mongodb/js-bson/issues/106 – JohnnyHK 8 February 2015 в 16:31
  • 2
    console.log (& Quot; здесь & Quot;); пусть i = новый mongoose.Types.ObjectId (userId.id); console.log (& quot; now here & quot;); // эта консоль даже не печатает – yogesh agrawal 22 January 2018 в 16:42
 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"});
        }

лучше всего проверить правильность

1
ответ дан yogesh agrawal 21 August 2018 в 11:01
поделиться

Это старый вопрос, но вы также можете использовать пакет 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);
        });

    });

});
1
ответ дан YouneL 21 August 2018 в 11:01
поделиться

Вы также можете использовать ObjectId.isValid, как показано ниже:

if (!ObjectId.isValid(userId)) return Error({ status: 422 })
3
ответ дан Ze Rubeus 21 August 2018 в 11:01
поделиться
0
ответ дан AiU 1 November 2018 в 05:11
поделиться
0
ответ дан Sushil Kadu 1 November 2018 в 05:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: