如何在 Loopback/NodeJs 中同时读取图像和文本

How to read an image and text at the same time in Loopback/NodeJs

我正在使用 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,}
    }
  );

这就是我到目前为止所得到的,我想要做的就是更改图像的路径

Result

我尝试添加 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 后得到的结果:

after adding fs.readfile

新方法的远程处理元数据将 return 值描述为 JSON 数据。实际值是 Buffer,由 LoopBack 转换为您在屏幕截图中显示的值。

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

如果您想要 API 到 return 图像,您需要进行两处更改:

  • 告诉 LoopBack 设置不同的 Content-Type header,例如image/png
  • 告诉 LoopBack 将缓冲区值视为原始响应body
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' } },
  ],
});