Как читать изображение и текст одновременно в Loopback / NodeJs - PullRequest
0 голосов
/ 10 мая 2019

Я делаю удаленный метод с Loopback, чтобы показать текст и отобразить изображение. Я получаю путь изображения и поля с помощью запроса SQL и данные отображаются правильно. Я хочу преобразовать путь, показанный в результате, для отображения самого изображения.

Пока это мой удаленный метод:

  cm_comediens.getprofile1 = function (options, cb) {
    const token = options && options.accessToken;
    const userId = token && token.userId;

    var ds = app.datasources.mydb;
    var sql = "SELECT comedien_perso_nom,comedien_perso_prenom,nationalite,photoscomedien.path FROM cm_comediens INNER JOIN photoscomedien ON cm_comediens.id_comedien=photoscomedien.id_comedien WHERE cm_comediens.id_comedien IN ( SELECT id_comedien FROM (SELECT id_comedien FROM cm_comediens WHERE id_utilisateur= '" + userId + "') as MakeitWork) AND photoscomedien.photo_profile=1  ";
    ds.connector.execute(sql, [], function (err, cm_comedienss) {
    if(err) {console.error(err);}
    cb(err, cm_comedienss);    
    }); 
    }

  cm_comediens.remoteMethod(
    'getprofile1', {
      http: {verb: 'GET'},
      description: 'Get Comediens infos',
      accepts: [{arg: "options","type": "object","http": "optionsFromRequest"},],
      returns: {arg: 'data',type: ['cm_comediens'],root: true,}
    }
  );

Это то, что я получаю до сих пор, и что я хочу сделать точно, это изменить путь к изображению

Результат

Я пытался добавить fs.readfile, но обнаружился странный результат. Я изменил дистанционный метод следующим образом:

ds.connector.execute(sql, [], function (err, cm_comedienss) {
fs.readFile(cm_comedienss[0].path, function(err, cm_comedienss) {
if(err) {console.error(err);}
cb(err, cm_comedienss);    
}); 
});
}

Это результат, который я получил после добавления readfile:

после добавления fs.readfile

1 Ответ

0 голосов
/ 10 мая 2019

Метаданные удаленного взаимодействия для вашего нового метода описывают возвращаемое значение как данные JSON. Фактическое значение - Buffer, которое LoopBack преобразует в значение, указанное на скриншоте.

{
  "$type": "base64"
  "$data": "(base64-encoded data of your image)" 
}

Если вы хотите, чтобы ваш API возвращал изображение, вам нужно сделать два изменения:

  • указать LoopBack установить другой заголовок Content-Type, например image/png
  • сказать LoopBack, что нужно использовать значение Buffer как необработанное тело ответа
cm_comediens.getprofile1 = function (options, cb) {
  ds.connector.execute(sql, [], function (err, found) {
    if (err) return cb(err);

    fs.readFile(found[0].path, function(err, image) {
      if(err) return cb(err);

      cb(null, image, 'image/png');
    });
  });
};


cm_comediens('getprofile1', {
  http: {verb: 'GET'},
  description: 'Get Comediens infos',
  accepts: [
    {arg: "options","type": "object","http": "optionsFromRequest"},
  ],
  returns: [
    { arg: 'body', type: 'file', root: true },
    { arg: 'Content-Type', type: 'string', http: { target: 'header' } },
  ],
});
...