'ОШИБКА: объект' NoneType \ 'не имеет атрибута \' setswith \ ' - PullRequest
0 голосов
/ 08 октября 2019

Я использую API лямбда-распознавания лиц и распознавания лиц через RapidAPI , и в настоящее время я загружаю изображение через их API. Ниже у меня есть 2 сценария. Оба имеют одинаковое содержание, но кажется, что работает только один, а другой выдает ошибку.

Я получаю следующую ошибку:

code: 500,
error: 'ERROR: \'NoneType\' object has no attribute \'startswith\''

Единственная разница между этими двумяявляется то, что один метод извлекает productId и productLink из базы данных Монго, в то время как другой жестко закодирован. Ниже приведен код:

//pulled from db and stored in variables
let productId = product._id.toString(); //5d9ca969835e1edb64cf03d5
let productLink = product.ProductLink; //http://localhost:4000/uploads/1570544614486-test.jpg

//insert data into api
//doesn't work
myFaceDetAPI.trainAlbum(productLink, productId);

//works     
myFaceDetAPI.trainAlbum("http://localhost:4000/uploads/1570544614486-test.jpg", "5d9ca969835e1edb64cf03d5");

моя функция:

this.trainAlbum = (url, id)=>{
     let requestString = "https://lambda-face-recognition.p.rapidapi.com/album_train";
     let req = unirest("POST", requestString);
     let imgURL = url;
     let entryId = id

     unirest.post(requestString)
      .header("X-RapidAPI-Key", API_KEY)
      .attach("files", fs.createReadStream(createPath(imgURL)))//creates file path
      .field("album", ALBUM_NAME)
      .field("albumkey", ALBUM_KEY)
      .field("entryid", entryId)
      .end(result => {
        console.log(result.body);
      });
}

Вопросы:

  1. Почему жестко закодированный метод работает и тот, который тянетданных из базы данных нет?
  2. Как заставить работать тот, который извлекает данные из базы данных?

1 Ответ

0 голосов
/ 08 октября 2019

Я обнаружил, что при загрузке данных через приложение переднего плана будет сохранять их в базе данных и мгновенно искать изображение в моем пути изображения, который еще не существует, отсюда и ошибка. Чтобы противостоять этой проблеме, я создал асинхронную функцию, которая будет задерживать вызов API, чтобы дать моей программе время для сохранения изображения в пути к изображению. Вот код:

async function customAsyncFunc(productLink, productId){
   console.log(1)
   await delay(5000)
   console.log(2)
   myFaceDetAPI.trainAlbum(productLink, productId)
}

function delay(ms){
    return new Promise(resolve=>{
        setTimeout(resolve,ms)
    })
}

// Defined store route
productRoutes.route('/add').post(function (req, res) {
  let product = new Product(req.body);
  //save to database
  product.save()
    .then(product => {
      let productId = product._id.toString();
      let productLink = product.ProductLink;
      res.status(200).json({'Product': 'Product has been added successfully'});

      //insert data into api    
      //delay sending data to api so that image can be stored into filepath first
      customAsyncFunc(productLink, productId);
    })
    .catch(err => {
        res.status(400).send("unable to save to database");
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...