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